有这样的文本数据
※ 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
我该怎么做?
答案 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"