我也想以相同的方式拆分同一列。我想这样做,因为它不能正常工作。
我使用的代码是
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;
任何人都可以指导我如何解决它。 谢谢
答案 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)
不过于优雅,这假设每个值的分割位置相同,但希望这会有所帮助。