【问题标题】:dplyr: How to calculate frequency of different values within each groupdplyr:如何计算每组内不同值的频率
【发布时间】:2021-06-11 20:46:14
【问题描述】:

我可能有一个简单的问题,但无法弄清楚。

我有一个包含两个变量的数据集,这两个变量都是因子。它看起来像这样:

my.data<-data.frame(name=c("a","a","b","b","b","b", "b", "b", "e", "e", "e"),
                var1=c(1, 2, 3, 4, 2, 1, 4, 1, 3, 4, 3))

我想计算所有 a、b 和 e 的频率 1、2、3 和 4,然后将它们聚合到一行中。这意味着所有“a”、“b”和“e”都应该在一行中,然后我想创建 4 个变量来指示这些行中所有 1、2、3 和 4 的频率。我已经设法计算出所有“a”、“b”和“e”计数的频率,但我无法将所有“a”、“b”和“e”折叠成单独的行。

我的代码是这个:

a <- my.data %>%
dplyr:: select(name, var1) %>%
mutate(name = as.factor(name),
     var1 = as.factor(var1)) %>% 
group_by(name, var1) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))

我的结果应该是这样的:

name   Freq1   Freq2   Freq3   Freq4
  a    0,00    0,00    0,5     0,5
  b    0,30    0,30    0,30    0,10
  e    0,20    0,20    0,20    0,40

谢谢。

【问题讨论】:

    标签: r dplyr frequency


    【解决方案1】:

    我们也可以在这里使用包janitor 来发挥很大的优势:

    library(janitor)
    
    my.data %>%
      tabyl(name, var1) %>%
      adorn_percentages()
    
     name         1         2         3         4
        a 0.5000000 0.5000000 0.0000000 0.0000000
        b 0.3333333 0.1666667 0.1666667 0.3333333
        e 0.0000000 0.0000000 0.6666667 0.3333333
    

    my.data %>%
      tabyl(name, var1) %>%
      adorn_percentages() %>%
      adorn_totals(c('row', 'col')) %>%
      adorn_pct_formatting(2)
    
      name      1      2      3      4   Total
         a 50.00% 50.00%  0.00%  0.00% 100.00%
         b 33.33% 16.67% 16.67% 33.33% 100.00%
         e  0.00%  0.00% 66.67% 33.33% 100.00%
     Total 83.33% 66.67% 83.33% 66.67% 300.00%
    

    【讨论】:

    • 这样看起来好多了,我的朋友,谢谢。
    • 看门我最喜欢的包以进行汇总/交叉表
    • 嘿,这创造了奇迹。非常感谢您的回答。我很感激:)
    【解决方案2】:

    你也可以使用base R's

    prop.table(table(my.data), 1)
    

    返回

        var1
    name         1         2         3         4
       a 0.5000000 0.5000000 0.0000000 0.0000000
       b 0.3333333 0.1666667 0.1666667 0.3333333
       e 0.0000000 0.0000000 0.6666667 0.3333333
    

    【讨论】:

      【解决方案3】:

      您可以使用pivot_wider 来获取宽格式数据-

      library(dplyr)
      library(tidyr)
      
      my.data %>%
        count(name, var1) %>%
        group_by(name) %>%
        mutate(n = prop.table(n)) %>%
        ungroup %>%
        pivot_wider(names_from = var1, values_from = n, names_prefix = 'Freq')
      
      #  name   Freq1  Freq2  Freq3  Freq4
      #  <chr>  <dbl>  <dbl>  <dbl>  <dbl>
      #1 a      0.5    0.5   NA     NA    
      #2 b      0.333  0.167  0.167  0.333
      #3 e     NA     NA      0.667  0.333
      

      【讨论】:

      • 嗨罗纳克,非常感谢。尽管它适用于这些数据。它不适用于我拥有的那些。我收到以下错误:警告消息:值不是唯一标识的;输出将包含列表列。 * 使用values_fn = list 抑制此警告。 * 使用values_fn = length 确定重复出现的位置 * 使用values_fn = {summary_fun} 汇总重复
      • 嗯...这很奇怪,不应该发生。您可以尝试将count 替换为dplyr::count,看看是否有任何变化?
      • 嗨,我的代码开头已经有了。我在所有这些操作之前应用了一个过滤器。
      • 是的,但是count 也是plyr 库的一部分,我觉得它可能会不小心从dplyr 中屏蔽count。因此,我要求使用dplyr::count 而不仅仅是count。如果这没有帮助,您可以使用 pivot_wider(names_from = var1, values_from = n, names_prefix = 'Freq', values_fn = sum) 对每个组合的值求和。
      • 我不应该将它们作为我猜的因素
      【解决方案4】:
      library(purrr)
      my.data %>% 
        split(.$name) %>% 
        {cbind(name = names(.), map_dfr(., ~pluck(.x, "var1") %>% table() %>% prop.table()))}
      
        name         1         2         3         4
      1    a 0.5000000 0.5000000        NA        NA
      2    b 0.3333333 0.1666667 0.1666667 0.3333333
      3    e        NA        NA 0.6666667 0.3333333
      

      【讨论】:

      • 嘿,成功了 :) 非常感谢您的回答!
      猜你喜欢
      • 1970-01-01
      • 2017-04-30
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多