我有一个类似于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列保留在原来的位置,虽然不知怎的,格式化所有内容都搞砸了,所以我把它留了出去。
答案 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的回答一样,你可以使用paste
让Chrom
看起来像你想要的那样:
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