根据R中的分隔符将一列拆分为多列

时间:2014-05-05 21:03:12

标签: string r split multiple-columns

我有一个类似于here

的问题

如果我有如下数据结构:

 ROW_NO.        INPUT          STRAND
       1  1,888639,T,C             -1
       2  1,889158,G,C             NA                               
       3  1,889159,A,C             NA                                     
       4 1,978978,GC,G              1                                      
       5  1,982941,T,C             NA                                      
       6 1,1888193,C,A             -1

如何拆分INPUT列需要做什么:

 ROW_NO.        INPUT    Chrom     Position    Ref.y   Variant.y   
       1  1,888639,T,C    chr1       888639        T           C
       2  1,889158,G,C    chr1       889158        G           C                            
       3  1,889159,A,C    chr1       889159        A           C                                         
       4 1,978978,GC,G    chr1       978978       GC           G        
       5  1,982941,T,C    chr1       982941        T           C        
       6 1,1888193,C,A    chr1      1888193        C           A

而且我将STRAND列保留在原来的位置,虽然不知怎的,格式化所有内容都搞砸了,所以我把它留了出去。

3 个答案:

答案 0 :(得分:2)

调用数据集df

library(stringr)
result <- data.frame(df,do.call(rbind,str_split(df$INPUT,",")))
result
#   ROW_NO.         INPUT STRAND X1      X2 X3 X4
# 1       1  1,888639,T,C     -1  1  888639  T  C
# 2       2  1,889158,G,C     NA  1  889158  G  C
# 3       3  1,889159,A,C     NA  1  889159  A  C
# 4       4 1,978978,GC,G      1  1  978978 GC  G
# 5       5  1,982941,T,C     NA  1  982941  T  C
# 6       6 1,1888193,C,A     -1  1 1888193  C  A

其余的是化妆品:

colnames(result)[4:7] <- c("Chrom","Position","Ref.y","Variant.y")
result$Chrom <- paste0("chr",result$Chrom)

编辑关于评论的说明。

建议的备选方案:

result <- data.frame(df,do.call(rbind,strsplit(df$INPUT,",")))
如果df$INPUT是一个因素,

会失败,它可能会也可能不会,这取决于您在数据中的读取方式。上面使用str_split(...)的解决方案并没有出现这种缺陷。

答案 1 :(得分:1)

如果d是您的数据框,则可以通过将read.csv函数应用于INPUT列来完成此操作:

> out <- cbind(d, read.csv(text=d$INPUT, header=FALSE,
                           col.names=c('Chrom','Position','Ref.y','Variant.y')))
> out
  ROW_NO.         INPUT STRAND Chrom Position Ref.y Variant.y
1       1  1,888639,T,C     -1     1   888639     T         C
2       2  1,889158,G,C     NA     1   889158     G         C
3       3  1,889159,A,C     NA     1   889159     A         C
4       4 1,978978,GC,G      1     1   978978    GC         G
5       5  1,982941,T,C     NA     1   982941     T         C
6       6 1,1888193,C,A     -1     1  1888193     C         A

而且,正如@ jlhoward的回答一样,你可以使用pasteChrom看起来像你想要的那样:

out$Chrom <- paste0('chr',out$Chrom)

答案 2 :(得分:1)

我会从我的&#34; splitstackshape&#34;中推荐concat.split包:

library(splitstackshape)
concat.split(mydf, "INPUT", ",")
#   ROW_NO.         INPUT STRAND INPUT_1 INPUT_2 INPUT_3 INPUT_4
# 1       1  1,888639,T,C     -1       1  888639       T       C
# 2       2  1,889158,G,C     NA       1  889158       G       C
# 3       3  1,889159,A,C     NA       1  889159       A       C
# 4       4 1,978978,GC,G      1       1  978978      GC       G
# 5       5  1,982941,T,C     NA       1  982941       T       C
# 6       6 1,1888193,C,A     -1       1 1888193       C       A

我目前正在研究的版本更快only at this Gist。最终,它将取代现有的concat.split函数。

cSplit(mydf, "INPUT", ",")
#    ROW_NO. STRAND INPUT_1 INPUT_2 INPUT_3 INPUT_4
# 1:       1     -1       1  888639       T       C
# 2:       2     NA       1  889158       G       C
# 3:       3     NA       1  889159       A       C
# 4:       4      1       1  978978      GC       G
# 5:       5     NA       1  982941       T       C
# 6:       6     -1       1 1888193       C       A