R正确导入每行不等数量的列

时间:2014-10-16 14:48:02

标签: r rows

我的数据集超过40,000行,每列的列数不等。我遇到的问题是每行末尾的每个值都属于同一列,但最终会在许多不同的列中跳水。

所以我的问题是:是否有一种简单的方法可以要求将每行的最终值放在同一列中?

标题是: c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14

  

BAC0004 | acr3 | tr | B5LX01 | B5LX01_CAMJU Acr3 GN = acr3 PE = 4 SV = 1多重耐药性
  BAC0017 | adeI | tr | Q2FD95 | Q2FD95_ACIBA AdeI GN = adeI PE = 4 SV = 1预测蛋白   BAC0001 | abeM | tr | Q5FAM9 | Q5FAM9_ACIBA多药外排泵AbeM GN = abeM PE = 4 SV = 2多药耐药蛋白

当前导入如下:

c1                                   c2        c3       c4     c5      c6        c7    c8  c9
BAC0004|acr3|tr|B5LX01|B5LX01_CAMJU  Acr3      GN=acr3  PE=4   SV=1    multidrug resistance
BAC0017|adeI|tr|Q2FD95|Q2FD95_ACIBA  AdeI      GN=adeI  PE=4   SV=1    predicted protein
BAC0001|abeM|tr|Q5FAM9|Q5FAM9_ACIBA  Multidrug efflux   pump   AbeM    GN=abeM   PE=4 SV=2 multidrug efflux pump

如果有什么我喜欢它的样子:

c1                                   c2        c3       c4     c5    c6      c7   c8   c9
BAC0004|acr3|tr|B5LX01|B5LX01_CAMJU  Acr3      GN=acr3  PE=4   SV=1  NA      NA   NA   multidrug resistance
BAC0017|adeI|tr|Q2FD95|Q2FD95_ACIBA  AdeI      GN=adeI  PE=4   SV=1  NA      NA   NA   predicted protein
BAC0001|abeM|tr|Q5FAM9|Q5FAM9_ACIBA  Multidrug efflux   pump   AbeM  GN=abeM PE=4 SV=2 multidrug efflux pump

但最喜欢这样:

c1                                                         c2   c3      c4   c5   c6
BAC0004|acr3|tr|B5LX01|B5LX01_CAMJU                        Acr3 GN=acr3 PE=4 SV=1 multidrug resistance
BAC0017|adeI|tr|Q2FD95|Q2FD95_ACIBA                        AdeI GN=adeI PE=4 SV=1 predicted protein
BAC0001|abeM|tr|Q5FAM9|Q5FAM9_ACIBA Multidrug efflux pump  AbeM GN=abeM PE=4 SV=2 multidrug efflux pump

这是第3行造成的所有问题 - 如果将名称保留为一个长字符串并且没有添加这3个额外的列,我更喜欢它,但正如我真正想要的那样是名称(c1)和描述(最后的价值)我愿意以这种方式处理它,如果没有其他方式。

但我只是在想,也许有一种方法可以告诉R如何划分字符串 - 也许是为了让所有的值都在" GN = *"之后。值被放入3个单独的列中。我不知道什么是最好的。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

这是一个非常混乱的文件格式。如果你将字段与制表符分开或者在行中很容易找到的东西会更好。作为一个人,我很难猜测休息的位置,所以我并不感到惊讶read.table有麻烦。

您可以使用正则表达式解析这些字符串。像

这样的东西
#lines <- readLines("filename.txt")
lines <- c("BAC0004|acr3|tr|B5LX01|B5LX01_CAMJU Acr3 GN=acr3 PE=4 SV=1 multidrug resistance",
"BAC0017|adeI|tr|Q2FD95|Q2FD95_ACIBA AdeI GN=adeI PE=4 SV=1 predicted protein","BAC0001|abeM|tr|Q5FAM9|Q5FAM9_ACIBA Multidrug efflux pump AbeM GN=abeM PE=4 SV=2 multidrug resistance protein")

m <-regexpr("(.*) (\\w+) (GN=\\S+) (PE=\\S+) (SV=\\S+) (.*)", lines, perl=T)

这将报告每列的开始位置和长度。您可以使用子字符串提取值,也可以使用regcapturedmatches之类的辅助函数。如果我们采用结果并在字段之间插入标签,那么我们可以使用read.table()来创建data.frame

read.table(text=sapply( regcapturedmatches(lines,m), function(x) paste(x, collapse="\t")), sep="\t", as.is=T)

给出了

                                                         V1   V2      V3   V4   V5                           V6
1                       BAC0004|acr3|tr|B5LX01|B5LX01_CAMJU Acr3 GN=acr3 PE=4 SV=1         multidrug resistance
2                       BAC0017|adeI|tr|Q2FD95|Q2FD95_ACIBA AdeI GN=adeI PE=4 SV=1            predicted protein
3 BAC0001|abeM|tr|Q5FAM9|Q5FAM9_ACIBA Multidrug efflux pump AbeM GN=abeM PE=4 SV=2 multidrug resistance protein

似乎与您想要的结果相符。