我的数据集超过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个单独的列中。我不知道什么是最好的。谢谢你的帮助。
答案 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
似乎与您想要的结果相符。