R正确导入每行不相等的列数
我有一个超过40000行的数据集,每个数据集的列数不相等。我遇到的问题是,每行末尾的每个值都属于同一列,但其结尾被划分为许多不同的列 所以我的问题是:有没有一种简单的方法可以让每一行的最终值放在同一列中 标题为: 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多药耐药R正确导入每行不相等的列数,r,rows,R,Rows,我有一个超过40000行的数据集,每个数据集的列数不相等。我遇到的问题是,每行末尾的每个值都属于同一列,但其结尾被划分为许多不同的列 所以我的问题是:有没有一种简单的方法可以让每一行的最终值放在同一列中 标题为: 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 | Q
BAC0017 | adeI | tr | Q2FD95 | Q2FD95 | ACIBA adeI GN=adeI PE=4 SV=1预测蛋白 BAC001 | abeM | tr | Q5FAM9 | Q5FAM9 |阿西巴多药外排泵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
如果我希望它看起来像这样:
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
但最好是这样:
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个单独的列中。我不知道什么是最好的。谢谢你的帮助。这是一个相当混乱的文件格式。最好是用制表符或行中容易找到的内容分隔字段。作为一个普通人,我很难猜到断点在哪里,所以我并不惊讶
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)
给
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
这似乎与您期望的结果相匹配。您可以发布一个小样本数据来说明您的问题以及您希望得到的结果吗?如果您在
read.table()
中指定fill=TRUE
,会有所帮助吗?fill=TRUE
用于用NAs左填充行。在这种情况下,我建议您导入除c6-c8之外的所有列(使用选项colClasses
,在?read.table
中解释),第二次读取这些列,然后合并数据。问题是每行的第一行有时有额外的文本,这会中断整个导入。因此,导入c6之前的所有列不会奏效。您可以尝试扫描(“filename”,what=character(),sep=”“)
,然后尝试组装数据帧。另外,您是否尝试过data.table
软件包中的fread
?太棒了!这对三行有效,行中有更多的列,我没有包括,但使用的方法与它工作的方法相同。但是文件是40000的事实又如何呢。我可以使用readLines(文件),但是对于readLines
行,应该返回一个字符数组,以便您可以直接使用结果,只需将其分配给变量lines
。