2014-01-16 28 views
3

我有刺和數字的表如下分隔的值的列:拆分用冒號成單獨的列的每個值

  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

你試過了嗎? –

回答

1

調用表vcf

vcf.info <- data.frame(t(sapply(vcf[,2], function(y) strsplit(y,split=":")[[1]]))) 

然後cbind與所需的原VCF列(S)

vcf.info2 <- cbind(vcf[,1],vcf.info) 

,但在真正的VCF我會

vcf.info2 <- cbind(vcf[,c(1,2,4,5,6,8,9)],vcf.info) 

別的東西,你可能會發現有用的,在這種情況下,我剛開閱讀深度,以1你然而,許多樣品代替n,3至5 GT,AD,DP,GQ,PL

selectReadDepth <- apply(vcf[,10:n],2,function(x) sapply(x, function(y) strsplit(y,split=":")[[1]][3])) 
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 
+0

@傑瑞米我沒有明白你的觀點。看起來你試圖談論一般情況,但對我來說並不清楚(至少你用vcf格式來描述它)。你假設一些不在OP(我猜不出OP有其他列)..也許你可以添加一個例子到你的答案... – agstudy

+0

是啊我知道更多的數據比OP給。它是從將基因序列數據與參考序列進行比對並調用變體而獲得的變體調用文件(vcf)中的兩列。您的解決方案適用於給定的示例數據。 – JeremyS

+0

@Jeremy我的意思是,如果您提供一般的文件格式以適應我的解決方案(即使我看不到它是如何失敗的),這將會有所幫助,更有趣的是 – agstudy

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 
1

我已經包含的函數族叫concat.split在我的「splitstackshape」包中,其中之一是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。對於較大的數據集,「data.table」變體的速度要快得多,但數據必須是「矩形的」(也就是說,分割後的結果列數必須平衡)。

相關問題