2015-08-19 70 views
3

我也想以相同的方式拆分同一列。我想这样做,因为下面的bur它不正常工作。如何拆分R中的列?

我使用的代码是 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 = "|")

而我运行我收到错误的脚本

错误:在“t38kbat <意外输入 - 分离(t38kbat,V2,C( “sp”,“id”,“gene_organism”),“

有人可以指导我如何解决它 谢谢

+0

不知道这是否是有意还是无意的,但你原来的问题消失了,什么是现在拍摄的是一个新的问题... – Sevyns

回答

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来获得compl ete行为。像

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

一些假设原来的列被称为col,并与最终的头部虚构的名字。

+0

伟大的答案! 我建议加上'库(tidyr)'行使用'separate'以防万一我们的朋友,是很新的R(即使你已经明确表示,'separate'从'tidyr'的代码块包。 – SavedByJESUS

+0

一个很好的答案,但OP要求一个比较繁琐的分比你这里显示的一个。 –

+0

@RichardScriven我编辑添加描述比较繁琐独立后记/统一工作流程,更像是在产生结果OP问道;你的评论和我的编辑一定是在以太网中传过去的。 – user295691

1

在我看来,(因为没有一个共同的分隔符分割的)子字符串()可能会对你有所帮助。 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) 

不是过于优雅,这是假定分割位置中的每个值是相同的,但希望这有助于。