将间隔的文本数据转换为数据框

时间:2018-11-11 09:00:46

标签: r

有这样的文本数据

※ 19:20 AAAA (BBB:CCC)    --DDDD aaaa         33.1   bbbb           23.8   cccc     20.9   ddddd       14.9 eeeee        8.3   ffffff        6.8   gggggg          4.5   hhhhhh 4.2    --EEEE aaaaa     11.8

或者有这样的HTML文件

<div style='AAAA'>
※ 19:20 AAAA (BB:CC)<br /><br /><br /><br />--DDDD<br />aaaa       33.1   bbbb         23.8   cccc   20.9<br /><br /><br />--EEEE<br />aaaaa         11.8

我想在Dataframe中制作的是

Time     Type1      Type2     Data1         Data2
19:20    AAAAA      DDDD      aaaa          33.1
19:20    AAAAA      DDDD      bbbb          23.8
19:20    AAAAA      EEEE      aaaaa         11.8

我该怎么做?

1 个答案:

答案 0 :(得分:0)

1)首先删除括号内的所有内容,包括给予txt2的括号。然后拆分--分隔符上剩余的内容,并将其展平,得到txt3。然后分别在单词中扫描每个元素,得到s并将其转换为矩阵m和数据帧DF。最后转换列的类型。不使用任何软件包。

txt2 <- gsub("[(].*?[)]", "", txt)
txt3 <- unlist(strsplit(txt2, "--"))
s <- lapply(txt3, function(x) scan(text = x, what = "", quiet = TRUE))
m <- cbind(s[[1]][1], s[[1]][2], do.call("rbind", lapply(s[-1], 
  function(x) cbind(x[1], matrix(x[-1],,2, byrow = TRUE)))))
DF <- as.data.frame(m, stringsAsFactors = FALSE)
DF[] <- lapply(DF, type.convert, stringsAsFactors = FALSE)

给予:

> DF
     V1   V2   V3     V4   V5
1 19:20 AAAA DDDD   aaaa 33.1
2 19:20 AAAA DDDD   bbbb 23.8
3 19:20 AAAA DDDD   cccc 20.9
4 19:20 AAAA DDDD  ddddd 14.9
5 19:20 AAAA DDDD  eeeee  8.3
6 19:20 AAAA DDDD ffffff  6.8
7 19:20 AAAA DDDD gggggg  4.5
8 19:20 AAAA DDDD hhhhhh  4.2
9 19:20 AAAA EEEE  aaaaa 11.8

2)如果我们可以假设只有第五列是数字,那么我们可以使用这种更简单的替代方法。首先按照上面的步骤删除括号和其中的所有内容,然后将单词扫描到s中。找到仅包含数字和点的单词的位置ix,然后挑选出将它们组装到data.frame中的每个字段。

txt2 <- gsub("[(].*?[)]", "", txt)
s <- scan(text = txt2, what = "", quiet = TRUE)
ix <- grep("^[0-9.]+$", s)
data.frame(
   V1 = s[1], 
   V2 = s[2], 
   V3 = sub("--", "", s[sapply(ix-2, function(i) tail(grep("--", s[seq(i)]), 1))]),
   V4 = s[ix-1],
   V5 = as.numeric(s[ix]), 
   stringsAsFactors = FALSE
)

注意

假定输入为:

txt <- "19:20 AAAA (BBB:CCC)    --DDDD aaaa         33.1   bbbb           23.8   cccc     20.9   ddddd       14.9 eeeee        8.3   ffffff        6.8   gggggg          4.5   hhhhhh 4.2    --EEEE aaaaa     11.8"