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

String 根据R中的分隔符将一列拆分为几列,string,r,split,multiple-columns,String,R,Split,Multiple Columns,我有一个问题与我们发现的问题相似 如果我的数据结构如下所示: ROW_NO. INPUT STRAND 1 1,888639,T,C -1 2 1,889158,G,C NA 3 1,889159,A,C NA

我有一个问题与我们发现的问题相似

如果我的数据结构如下所示:

 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
要像这样拆分输入列,我需要做什么:

 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列保留在原来的位置,尽管在格式化时,这里的一切都搞砸了,所以我把它忽略了。

调用您的数据集
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
库(stringr)

结果如果
d
是您的数据帧,您可以在base中将
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

我建议从我的“splitstackshape”软件包中选择
concat.split

有一个更快的版本,我一直在工作,目前是。最终,它将取代现有的
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

我不确定这里添加了什么
stringr
,因为
result@Thomas,它为您的编辑增加了一些等待时间:-),即使
df$INPUT
是一个因素,使用
strsplit(as.character(df$INPUT),…)
会更快。不幸的是,“stringr”中的一些函数以非常大的时间成本提供了便利,而
stru split
就是其中之一。我的建议是:
data.frame(mydf,do.call(rbind,strsplit(as.character(mydf$INPUT),“,”,fixed=TRUE))
fixed=TRUE
也将提供很好的速度提升。我得到了一个错误:“文本连接(text)中的错误:无效的'text'参数”@soosus,这个错误是不言自明的。只需将
d$INPUT
包装为.character,您的问题就会得到解决。
> 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
out$Chrom <- paste0('chr',out$Chrom)
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
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