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