将冒号分隔的一列值拆分为每个值的单独列

时间:2014-01-16 08:13:41

标签: r split delimiter

我有一张叮咬和数字表如下:

           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

4 个答案:

答案 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 answerthis 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]))