R - 将文本文件解析为fscanf?

时间:2018-03-17 11:20:47

标签: r

我有一个大文本文件,我想在R中导入,其中多模式数据编码如下:

count--;

我想要的是与此类似的数据框:

count--;

因为每一行都反复重复列名称,所以我想知道是否有一种方法导入具有fscanf功能的文本文件,该文件将解析A,B,C列名称,例如" A =%d,B =%d,C =%d,...."

或者使用read.table或scan可能有更简单的方法吗?但我无法弄清楚如何。

感谢任何提示

1 个答案:

答案 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], "=.*?(,|$)")))