我有一个大文本文件,我想在R中导入,其中多模式数据编码如下:
count--;
我想要的是与此类似的数据框:
count--;
因为每一行都反复重复列名称,所以我想知道是否有一种方法导入具有fscanf功能的文本文件,该文件将解析A,B,C列名称,例如" A =%d,B =%d,C =%d,...."
或者使用read.table或scan可能有更简单的方法吗?但我无法弄清楚如何。
感谢任何提示
答案 0 :(得分:1)
1)gsubfn包中的read.pattern read.pattern
非常接近您的要求。指定模式时,而不是%d
使用(\\d+)
。如果列名不重要,则可以省略col.names
参数。
library(gsubfn)
L <- c("A=1,B=1,C=2", "A=1,B=1,C=2", "A=1,B=1,C=2") # test input
pat <- "A=(\\d+),B=(\\d+),C=(\\d+)"
read.pattern(text = L, pattern = pat, col.names = unlist(strsplit(pat, "=.*?(,|$)")))
,并提供:
A B C
1 1 1 2
2 1 1 2
3 1 1 2
1a)格式百分比为了好玩,我们可以使用问题中给出的格式来实现它。
fmt <- "A=%d,B=%d,C=%d"
pat <- gsub("%d", "(\\\\d+)", fmt)
现在运行上面的read.pattern
语句。
2)strapply 再次使用相同的输入和gsubfn包,另一种方法是拔出所有数字串,无需减少(1)中所示的pat
模式只是"\\d+"
。
DF <- strapply(L, "\\d+", as.numeric, simplify = data.frame)
names(DF) <- unlist(strsplit(L[1], "=.*?(,|$)"))
3)read.csv 更简单的是这个基本解决方案,它删除标题并读取剩下的内容,设置列名称,如前面的解决方案中所示。如果列名不重要,请再次省略col.names
参数。
read.csv(text = gsub("\\w*=", "", L), header = FALSE,
col.names = unlist(strsplit(L[1], "=.*?(,|$)")))