【问题标题】:How can I best use dplyr to subset data and create relative frequency tables?如何最好地使用 dplyr 对数据进行子集化并创建相对频率表?
【发布时间】:2022-02-03 06:39:26
【问题描述】:

我正在使用iris 数据集来学习如何使用dplyr,并尝试创建一个如下所示的相对频率表:

Petal.Width .1 .2 .3 .4 .5 .6 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8
Species
setosa 0.10 0.58 0.14 0.14 0.02 0.02 0 0 0 0 0 0 0 0 0
versicolor 0 0 0 0 0 0 0.14 0.06 0.10 0.26 0.14 0.02 0.20 0.04 0.06

我正在努力按物种对观察结果进行分组,然后逐个物种产生相对频率。

我猜它必须是使用 group_by、mutate 和 count 的东西,但我可以在网上找到的最接近的东西是:

my_data %>% 
    group_by(Petal.Width,Species) %>% 
    summarise(n = n()) %>%
    ungroup %>% 
    mutate(total = sum(n), rel.freq = n / total)

这仍然不是我想要的,因为它是观察的总数,而不是每个物种的数量。

非常感谢任何帮助!

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    您可以在 dplyr 中执行此操作,但它是基础 R 中的单行:

    t(apply(table(iris$Species, iris$Petal.Width), 1, function(x) x/sum(x)))
    #>             
    #>              0.1  0.2  0.3  0.4  0.5  0.6    1  1.1 1.2  1.3  1.4  1.5  1.6
    #>   setosa     0.1 0.58 0.14 0.14 0.02 0.02 0.00 0.00 0.0 0.00 0.00 0.00 0.00
    #>   versicolor 0.0 0.00 0.00 0.00 0.00 0.00 0.14 0.06 0.1 0.26 0.14 0.20 0.06
    #>   virginica  0.0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0 0.00 0.02 0.04 0.02
    #>             
    #>               1.7  1.8 1.9    2  2.1  2.2  2.3  2.4  2.5
    #>   setosa     0.00 0.00 0.0 0.00 0.00 0.00 0.00 0.00 0.00
    #>   versicolor 0.02 0.02 0.0 0.00 0.00 0.00 0.00 0.00 0.00
    #>   virginica  0.02 0.22 0.1 0.12 0.12 0.06 0.16 0.06 0.06
    

    reprex package (v2.0.1) 于 2022-02-02 创建

    【讨论】:

    • m = table(iris$Species, iris$Petal.Width); m/rowSums(m)
    【解决方案2】:

    这样的?

    但不确定“宽”格式;我倾向于保持它尽可能长(省略pivot_wider 步骤)。

    library(dplyr)
    library(tidyr)
    
    iris %>% 
      count(Species, Petal.Width) %>% 
      group_by(Species) %>% 
      mutate(p = n/sum(n)) %>% 
      ungroup() %>% 
      select(-n) %>% 
      pivot_wider(names_from = "Petal.Width", values_from = "p")
    

    结果:

    Species    `0.1` `0.2` `0.3` `0.4` `0.5` `0.6`   `1` `1.1` `1.2` `1.3` `1.4` `1.5` `1.6` `1.7` `1.8` `1.9`   `2` `2.1` `2.2` `2.3` `2.4` `2.5`
      <fct>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1 setosa       0.1  0.58  0.14  0.14  0.02  0.02 NA    NA     NA   NA    NA    NA    NA    NA    NA     NA   NA    NA    NA    NA    NA    NA   
    2 versicolor  NA   NA    NA    NA    NA    NA     0.14  0.06   0.1  0.26  0.14  0.2   0.06  0.02  0.02  NA   NA    NA    NA    NA    NA    NA   
    3 virginica   NA   NA    NA    NA    NA    NA    NA    NA     NA   NA     0.02  0.04  0.02  0.02  0.22   0.1  0.12  0.12  0.06  0.16  0.06  0.06
    

    【讨论】:

    • 非常感谢!这非常接近我的需要!对于我自己的学习,这里的 n 是怎么回事?我想了解它在做什么。
    • ncount 生成的列的默认名称。
    • n 如何自动识别哪些观察结果与单个物种相关?不是将所有 setosa 实例除以 150 个值,而是除以 50(即 setosa 的 50 个)?
    • group_by 就是这样做的。理解代码的最佳方式是通过添加每一行来运行它:从前 2 行开始,直到但不包括 %&gt;%,然后是前 3 行,前 4 等等(总是直到但不包括%&gt;%。这样您将看到每个阶段的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多