我有一张叮咬和数字表如下:
V1 V2
1 GT:AD:DP:GQ:PL 0/1:10,45:55:70:106,0,70
2 GT:AD:DP:GQ:PL 1/1:2,42:44:16:288,16,0
3 GT:AD:DP:GQ:PL 1/1:3,37:40:14:147,14,0
4 GT:AD:DP:GQ:PL 0/1:7,50:57:55:250,0,55
对于向量V2
,我想将':' - 分隔(冒号分隔)值拆分为每个值的单独列,例如:
V1 V2 V3 V4 V5 V6
1 GT:AD:DP:GQ:PL 0/1 10,45 55 70 106,0,70
答案 0 :(得分:3)
使用read.table
两次使用2个不同的分隔符:
txt = ' V1 V2
1 GT:AD:DP:GQ:PL 0/1:10,45:55:70:106,0,70
2 GT:AD:DP:GQ:PL 1/1:2,42:44:16:288,16,0
3 GT:AD:DP:GQ:PL 1/1:3,37:40:14:147,14,0
4 GT:AD:DP:GQ:PL 0/1:7,50:57:55:250,0,55'
## here replace text=txt with your file name
dat <- read.table(text=txt,header=TRUE,stringsAsFactors=FALSE)
data.frame(x1=dat$V1,read.table(text=dat$V2,sep=':'))
x1 V1 V2 V3 V4 V5
1 GT:AD:DP:GQ:PL 0/1 10,45 55 70 106,0,70
2 GT:AD:DP:GQ:PL 1/1 2,42 44 16 288,16,0
3 GT:AD:DP:GQ:PL 1/1 3,37 40 14 147,14,0
4 GT:AD:DP:GQ:PL 0/1 7,50 57 55 250,0,55
答案 1 :(得分:3)
另一种方法
data.frame(DF$V1, do.call(rbind, strsplit(DF$V2, split = ":", fixed = TRUE)))
## DF.V1 X1 X2 X3 X4 X5
## 1 GT:AD:DP:GQ:PL 0/1 10,45 55 70 106,0,70
## 2 GT:AD:DP:GQ:PL 1/1 2,42 44 16 288,16,0
## 3 GT:AD:DP:GQ:PL 1/1 3,37 40 14 147,14,0
## 4 GT:AD:DP:GQ:PL 0/1 7,50 57 55 250,0,55
答案 2 :(得分:3)
我在&#34; splitstackshape&#34;中包含了一系列名为concat.split
的函数。包,其中一个是concat.split.multiple
。在引擎盖下,它就像@ agstudy的答案,但允许你一次拆分多个列。
用法很简单:
library(splitstackshape)
### Three required arguments: The input dataset,
### a vector of the columns that need to be split up
### (can also be the numeric column position), and the
### separator that should be used (can be different
### for each column).
concat.split.multiple(data = dat, split.cols = c("V2"), seps = ":")
# V1 V2_1 V2_2 V2_3 V2_4 V2_5
# 1 GT:AD:DP:GQ:PL 0/1 10,45 55 70 106,0,70
# 2 GT:AD:DP:GQ:PL 1/1 2,42 44 16 288,16,0
# 3 GT:AD:DP:GQ:PL 1/1 3,37 40 14 147,14,0
# 4 GT:AD:DP:GQ:PL 0/1 7,50 57 55 250,0,55
另请参阅this answer和this Gist,了解函数开发的位置。 &#34; data.table&#34;变量在较大的数据集上会快得多,但数据必须是&#34;矩形&#34; (也就是说,必须平衡分割后得到的列数。)
答案 3 :(得分:1)
调用该表vcf
vcf.info <- data.frame(t(sapply(vcf[,2], function(y) strsplit(y,split=":")[[1]])))
然后cbind
使用您想要的原始vcf列
vcf.info2 <- cbind(vcf[,1],vcf.info)
但是在真正的vcf我会
vcf.info2 <- cbind(vcf[,c(1,2,4,5,6,8,9)],vcf.info)
你可能会发现其他有用的东西,在这种情况下,我只是获取读取深度,用你拥有的多个样本替换n,以及用于GT,AD,DP,GQ,PL <3的3到1 >
selectReadDepth <- apply(vcf[,10:n],2,function(x) sapply(x, function(y) strsplit(y,split=":")[[1]][3]))