【问题标题】:Relative frequency with dplyr unexpected outputdplyr 意外输出的相对频率
【发布时间】:2020-03-02 11:23:44
【问题描述】:

我有以下数据框(子集):

    kingdom     phylum   class      order            family          genus
1  Bacteria    unknown unknown    unknown           unknown        unknown
2  Bacteria Firmicutes Bacilli Bacillales       Bacillaceae       Bacillus
3  Bacteria    unknown unknown    unknown           unknown        unknown
4  Bacteria Firmicutes Bacilli Bacillales      Listeriaceae       Listeria
5  Bacteria    unknown unknown    unknown           unknown        unknown
6  Bacteria Firmicutes Bacilli Bacillales       Bacillaceae       Bacillus
7   unknown    unknown unknown    unknown           unknown        unknown




tax <- structure(list(kingdom = c("Bacteria", "Bacteria", "Bacteria", 
"Bacteria", "Bacteria", "Bacteria", "unknown", "Bacteria", "Bacteria", 
"Bacteria"), phylum = c("unknown", "Firmicutes", "unknown", "Firmicutes", 
"unknown", "Firmicutes", "unknown", "Firmicutes", "Firmicutes", 
"Firmicutes"), class = c("unknown", "Bacilli", "unknown", "Bacilli", 
"unknown", "Bacilli", "unknown", "Bacilli", "Bacilli", "Bacilli"
), order = c("unknown", "Bacillales", "unknown", "Bacillales", 
"unknown", "Bacillales", "unknown", "Bacillales", "Bacillales", 
"Bacillales"), family = c("unknown", "Bacillaceae", "unknown", 
"Listeriaceae", "unknown", "Bacillaceae", "unknown", "Bacillaceae", 
"Bacillaceae", "Staphylococcaceae"), genus = c("unknown", "Bacillus", 
"unknown", "Listeria", "unknown", "Bacillus", "unknown", "Bacillus", 
"Bacillus", "Staphylococcus"), species = c("uncultured bacterium", 
"Bacillus subtilis", "unknown", "Listeria monocytogenes", "uncultured bacterium", 
"Bacillus subtilis", "metagenome", "Bacillus subtilis", "Bacillus subtilis", 
"Staphylococcus aureus")), row.names = c(NA, 10L), class = "data.frame")


 cols <- colnames(tax)

每一行都可以重复,所以我按如下方式计算唯一行并为每一行添加一个频率:

 df2 <- tax %>% 
        group_by(.dots=cols) %>%
        summarise(counts = n())  %>%
        mutate(relative_abundance=( counts/sum(counts)))


> df2
# A tibble: 6 x 9
# Groups:   kingdom, phylum, class, order, family, genus [5]
  kingdom  phylum   class  order    family      genus    species       counts relative_abunda…
  <chr>    <chr>    <chr>  <chr>    <chr>       <chr>    <chr>          <int>            <dbl>
1 Bacteria Firmicu… Bacil… Bacilla… Bacillaceae Bacillus Bacillus sub…      4            1    
2 Bacteria Firmicu… Bacil… Bacilla… Listeriace… Listeria Listeria mon…      1            1    
3 Bacteria Firmicu… Bacil… Bacilla… Staphyloco… Staphyl… Staphylococc…      1            1    
4 Bacteria unknown  unkno… unknown  unknown     unknown  uncultured b…      2            0.667
5 Bacteria unknown  unkno… unknown  unknown     unknown  unknown            1            0.333
6 unknown  unknown  unkno… unknown  unknown     unknown  metagenome         1            1

我期待独特的行,每个细菌/未知的百分比在 0 到 100 之间。怎么了??

例如,我们总共有 4 株枯草芽孢杆菌。计数总和为 10。所以 4/10*100=40%

【问题讨论】:

  • 在总结之后尝试取消组合

标签: r dplyr


【解决方案1】:

你忘了ungroup()summarise 之后,即sum(counts) 给出了每个组的总和。试试这个:

df2 <- tax %>% 
  group_by(.dots=cols) %>%
  summarise(counts = n())  %>%
  ungroup() %>% 
  mutate(relative_abundance = counts / sum(counts))

或更简洁:使用count 而不是group_by + summarise + ungroup

df2 <- tax %>% 
    count(.dots = cols)  %>%
    mutate(relative_abundance = n / sum(n))

斯蒂芬

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 2014-08-25
    • 2021-11-29
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多