【问题标题】:find common in two out of three columns, summarize them in R在三列中的两列中找到共同点,在 R 中总结它们
【发布时间】:2018-09-07 20:29:04
【问题描述】:

我有以下数据框:

    genus_sub <- structure(list(GutREF001.1_MDA_1 = c(0, 1, 0, 0, 0, 0, 0, 0, 
0, 0), GutREF001.1_MDA_2 = c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0), GutREF001.1_MDA_3 = c(0, 
1, 0, 0, 0, 0, 0, 0, 0, 0), GutREF001.2_MDA_1 = c(0, 1, 0, 0, 
0, 0, 0, 0, 0, 0), GutREF001.2_MDA_2 = c(0, 1, 0, 0, 0, 0, 0, 
0, 0, 0), GutREF001.2_MDA_3 = c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0), 
    ID = c("Enterococcaceae (B; Firm)", "Oscillospiraceae (B; Firm)", 
    "Enterobacteriaceae (B; Prot)", "Helicobacteraceae (B; Prot)", 
    "Peptoniphilaceae (B; Firm)", "Flavobacteriaceae (B; Bact)", 
    "Methanobacteriaceae (A; Eury)", "Coriobacteriaceae (B; Acti)", 
    "Micrococcaceae (B; Acti)", "Lactobacillaceae (B; Firm)")), .Names = c("GutREF001.1_MDA_1", 
"GutREF001.1_MDA_2", "GutREF001.1_MDA_3", "GutREF001.2_MDA_1", 
"GutREF001.2_MDA_2", "GutREF001.2_MDA_3", "ID"), row.names = c("Enterococcaceae (B; Firm)", 
"Oscillospiraceae (B; Firm)", "Enterobacteriaceae (B; Prot)", 
"Helicobacteraceae (B; Prot)", "Peptoniphilaceae (B; Firm)", 
"Flavobacteriaceae (B; Bact)", "Methanobacteriaceae (A; Eury)", 
"Coriobacteriaceae (B; Acti)", "Micrococcaceae (B; Acti)", "Lactobacillaceae (B; Firm)"
), class = "data.frame")

由 MDA_1、MDA_2 和 MDA_3 分隔的相同列名是一式三份(技术重复样本)分析需要一次在三个这样的相同样本之间进行

我想计算:

我。共识 - 即对于每一行,确定 50% 的样本中存在的 ID(值 == 1)或在这种情况下至少三分之二

二。 Sample_consensus_detected - 从上面确定的共识集中,找出一式三份的单个样本中存在的 ID 数

三。 Sample_consensus_not_detected - 从上面确定的共识集中,找出三份的单个样本中不存在的 ID 数量

四。 Replicate_not_in_consensus - 存在于单个样本中但不存在于共识中

四。 summary_metric_1 - (ii / (ii + iii))

v. summary_metric_2 = (iv / (ii + iv))

我编写了以下代码来开始汇总三组:

row.names(genus_sub) <- genus_table$ID
genus_sub$ID <- NULL

genus_sub %>% 
  gather(key, value) %>% 
  extract(key, c("sample_id", "rep"), "([[:alnum:]]+)_MDA_([[:alnum:]]+)") %>% 
  group_by(sample_id) %>% 
  summarize(sample_sum = sum(value))

但无法确定一种计算一致性的方法,即在三列中的两列中存在 ID 的行的总和值 (==1)。任何帮助表示赞赏。预期输出如下:

【问题讨论】:

  • 您能否向我们展示您想要的输出,以便您的目标更加清晰?
  • 嗨,我已对问题进行了编辑以显示预期结果

标签: r dplyr reshape tidyr


【解决方案1】:

您可以像这样通过融合数据来计算共识(请注意,这需要在您删除 ID 列之前提供数据):

melted <- melt(genus_sub,id="ID")
melted$variable <- substr(melted$variable,1,nchar(as.character(melted$variable))-2)
melted %>%
  group_by(ID,variable) %>%
  summarize(value = sum(value)) %>%
  dcast(ID ~ variable, sum)

substring 函数删除列名中的计数器(现在是融合数据表中variable 的值),以便您可以按variable 分组。如果您有超过 9 个样本需要达成共识的示例,您可以将其替换为更详细的 gsub

输出给出每列中 ==1 的 ID 和总和(因此要达成二元共识,您需要将 2 或 3 转换为 1,否则为 0。

                              ID GutREF001.1_MDA GutREF001.2_MDA
1    Coriobacteriaceae (B; Acti)               0               0
2   Enterobacteriaceae (B; Prot)               0               0
3      Enterococcaceae (B; Firm)               0               0
4    Flavobacteriaceae (B; Bact)               0               0
5    Helicobacteraceae (B; Prot)               0               0
6     Lactobacillaceae (B; Firm)               0               0
7  Methanobacteriaceae (A; Eury)               0               0
8       Micrococcaceae (B; Acti)               0               0
9     Oscillospiraceae (B; Firm)               3               3
10    Peptoniphilaceae (B; Firm)               0               0  

【讨论】:

  • 谢谢,我了解您的解决方案,直到 group_by... 但是,summary 只是对特定 ID 的值求和。它不会从更新的问题中计算共识和进一步派生的指标(即使我将 2 或 3 转换为 1)您能否详细说明或更新您的答案,以便从更新的问题中获得附图中的输出。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2016-11-02
  • 2019-06-24
  • 2018-05-09
  • 2021-10-19
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多