我有一个叫mydf的数据仓库。我希望根据ASM列和GPM列中给出的格式拆分FORMAT和GPM列中的内容,并获取result。因此,基本上,ASM和GPM列的列数量与:分隔的格式列中的总唯一元素(即5个不同的唯一元素)一样多,以便在result中展开。然后,需要将正确的值放在正确的列中(使用.GT、.FT等),如FORMAT列所示。
mydf <- structure(list(`#CHROM` = c(1L, 1L, 1L), POS = c(10490L, 10493L,
10494L), FORMAT = c("GT:FT:GQ", "GT:PS:GL", "GT:PS:FT"), ASM = c("1/1:TRUE:4,2,333",
"./.:.:.", "0/1:.:VQLOW"), GPM = c("./.:.:.", "1/1:4:2,233",
"0/1:22:VQHIGH")), .Names = c("#CHROM", "POS", "FORMAT", "ASM",
"GPM"), class = "data.frame", row.names = c(NA, -3L))结果:
result <- structure(list(`#CHROM` = c(1L, 1L, 1L), POS = c(10490L, 10493L,
10494L), FORMAT = c("GT:FT:GQ", "GT:PS:GL", "GT:PS:FT"), ASM.GT = c("1/1",
"./.", "0/1"), ASM.FT = c("TRUE", NA, "VQLOW"), ASM.GQ = c("4,2,333",
NA, NA), ASM.PS = c(NA, NA, NA), ASM.GL = c(NA, NA, NA), GPM.GT = c("./.",
"1/1", "0/1"), GPM.FT = c(NA, NA, "VQHIGH"), GPM.GQ = c(NA, NA,
NA), GPM.PS = c(NA, 4L, 22L), GPM.GL = c(NA, 2233L, NA)), .Names = c("#CHROM",
"POS", "FORMAT", "ASM.GT", "ASM.FT", "ASM.GQ", "ASM.PS", "ASM.GL",
"GPM.GT", "GPM.FT", "GPM.GQ", "GPM.PS", "GPM.GL"), class = "data.frame", row.names = c(NA,
-3L))发布于 2016-01-17 13:57:19
由于每个要拆分的列中的值数目似乎是相同的,所以我们可以利用"data.table“中的data.table处理多个value.var的能力。
分裂可以由cSplit从我的"splitstackshape“包完成。
library(splitstackshape)
dcast(cSplit(mydf, c("FORMAT", "ASM", "GPM"), ":", "long"),
`#CHROM` + POS ~ FORMAT, value.var = c("ASM", "GPM"))
# #CHROM POS ASM_FT ASM_GL ASM_GQ ASM_GT ASM_PS GPM_FT GPM_GL GPM_GQ GPM_GT GPM_PS
# 1: 1 10490 TRUE NA 4,2,333 1/1 NA . NA . ./. NA
# 2: 1 10493 NA . NA ./. . NA 2,233 NA 1/1 4
# 3: 1 10494 VQLOW NA NA 0/1 . VQHIGH NA NA 0/1 22注意,"#CHROM"是一个非常R-不友好的列名,因为#是注释字符。
如果您需要在"FORMAT“列中添加,请在上面的[, FORMAT:= mydf$FORMAT][]末尾添加一个dcast。
我假设您可以在这里处理进一步的清洗(例如,用.替换NA,并在任何地方删除1000个逗号分隔符)。
https://stackoverflow.com/questions/34838216
复制相似问题