如何拆分R中的列?

时间:2015-08-19 15:13:18

标签: r split

我也想以相同的方式拆分同一列。我想这样做,因为它不能正常工作。

我使用的代码是 t38kbat = read.table("test38kbat.txt", header = FALSE) head(t38kbat)

t38kbat <- separate (t38kbat, V2, c("sp", "id", "gene_organism"), \\"|") t38kbat <- separate (t38kbat, gene_organism, c("gene", "organism"), \\"_") t38kbat <- unite (t38kbat, sp, sp, id, sep = "|")

当我运行脚本时,我收到了错误

错误:&#34; t38kbat&lt; - 中的意外输入(t38kbat,V2,c(&#34; sp&#34;,&#34; id&#34;,&#34; gene_organism&#34; ),\&#34;

任何人都可以指导我如何解决它。 谢谢

2 个答案:

答案 0 :(得分:2)

在基础R中,strsplit命令将对该表单的向量进行操作,但会生成一个列表,您必须进一步简化该列表。

tidyr包中,有一个separate函数可以保留事物的数据框性质。对于这个用例,这可能是最好的。

例如

> library(tidyr)
> a <- data.frame(x=1:3, y=c("a|b|c", "b|c|d", "d|e|f"))
> a
  x     y
1 1 a|b|c
2 2 b|c|d
3 3 d|e|f
> separate(a, y, c("a","b","c"), '\\|')
  x a b c
1 1 a b c
2 2 b c d
3 3 d e f

要稍微充实strsplit解决方案,你必须使用cbinds稍微笨拙的组合才能到达那里

> cbind(a, do.call(cbind, strsplit(as.character(a$y), "\\|")))
  x     y 1 2 3
1 1 a|b|c a b d
2 2 b|c|d b c e
3 3 d|e|f c d f

编辑:还应注意,如果使用tidyr方法,则必须递归使用它,可能使用unite,以获得完整的行为。像

这样的东西
df <- separate(df, col, c("type", "subtype", "rawclass"), "\\|")
df <- separate(df, rawclass, c("class", "subclass"), "_")
df <- unite(df, sp, type, subtype, sep="|")

假设原始列名为col,并且具有最终标题的虚构名称。

答案 1 :(得分:1)

在我看来(因为没有可拆分的常用分隔符)substring()可能对你有所帮助。 substring()需要一个起始位置和结束位置;如果这是可预测的(和静态的),逻辑将看起来像这样:

myDataFrame = data.frame(Column2 = "sp|Q10CQ1|MAD14_ORYSJ")
myDataFrame$newCol1 = substring(myDataFrame$Column2,1,10)
myDataFrame$newCol2 = substring(myDataFrame$Column2,11,15)
myDataFrame$newCol3 = substring(myDataFrame$Column2,17,21)

不过于优雅,这假设每个值的分割位置相同,但希望这会有所帮助。