首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据R中另一列的条件将列内容解压缩为新列

如何根据R中另一列的条件将列内容解压缩为新列
EN

Stack Overflow用户
提问于 2016-01-17 12:18:40
回答 1查看 229关注 0票数 1

我有一个叫mydf的数据仓库。我希望根据ASM列和GPM列中给出的格式拆分FORMATGPM列中的内容,并获取result。因此,基本上,ASM和GPM列的列数量与:分隔的格式列中的总唯一元素(即5个不同的唯一元素)一样多,以便在result中展开。然后,需要将正确的值放在正确的列中(使用.GT、.FT等),如FORMAT列所示。

代码语言:javascript
复制
 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))

结果:

代码语言:javascript
复制
 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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-17 13:57:19

由于每个要拆分的列中的值数目似乎是相同的,所以我们可以利用"data.table“中的data.table处理多个value.var的能力。

分裂可以由cSplit从我的"splitstackshape“包完成。

代码语言:javascript
复制
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个逗号分隔符)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34838216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档