【问题标题】:Find relative frequencies of summarized columns in R查找 R 中汇总列的相对频率
【发布时间】:2022-01-28 05:08:13
【问题描述】:

我需要获取 R 中汇总列的相对频率。我使用 dplyr 的汇总来查找每个分组行的总数,如下所示:

data %>%
  group_by(x) %>%
  summarise(total = sum(dollars))

     x                    total 
   <chr>                 <dbl>
 1 expense 1              3600 
 2 expense 2              2150 
 3 expense 3              2000 

但是现在我需要为每个总行的相对频率创建一个新列才能得到这个结果:

     x                   total     p
   <chr>                 <dbl>   <dbl>
 1 expense 1              3600   46.45%
 2 expense 2              2150   27.74%
 3 expense 3              2000   25.81%

我试过了:

data %>%
  group_by(x) %>%
  summarise(total = sum(dollars), p = scales::percent(total/sum(total))

还有这个:

data %>%
  group_by(x) %>%
  summarise(total = sum(dollars), p = total/sum(total)*100)

但结果总是这样:

     x                   total     p
   <chr>                 <dbl>   <dbl>
 1 expense 1              3600    100%
 2 expense 2              2150    100%
 3 expense 3              2000    100%

问题似乎是可能影响结果的汇总总计列。有什么想法可以帮助我吗?谢谢

【问题讨论】:

    标签: r dplyr group-by percentage summarize


    【解决方案1】:

    由于分组,您获得 100%。但是,在您总结之后, dplyr 将删除一级分组。这意味着如果你例如做mutate()之后,你会得到你需要的结果:

    library(dplyr)
    
    data <- tibble(
      x = c("expense 1", "expense 2", "expense 3"),
      dollars = c(3600L, 2150L, 2000L)
    )
    
    
    data %>%
      group_by(x) %>%
      summarise(total = sum(dollars)) %>% 
      mutate(p = total/sum(total)*100)
    
    
    # A tibble: 3 x 3
      x         total     p
      <chr>     <int> <dbl>
    1 expense 1  3600  46.5
    2 expense 2  2150  27.7
    3 expense 3  2000  25.8
    

    【讨论】:

    • 比我的答案好多了,我忘了"drop_last" 在结果每组只有一行的情况下是自动的。
    • 完美运行!谢谢
    【解决方案2】:

    您得到 100%,因为它计算了该特定组的总数。您需要取消分组。假设您想除以总条目,只需除以nrow(df)

    data %>%
      group_by(x) %>%
      summarise(total = sum(dollars), p = total/nrow(data)*100)
    

    【讨论】:

      【解决方案3】:

      在第一个sum 之后,取消组合并使用mutate 创建p

      iris %>%
        group_by(Species) %>%
        summarise(total = sum(Sepal.Length)) %>%
        ungroup() %>%
        mutate(p = total/sum(total)*100)
      ## A tibble: 3 x 3
      #  Species    total     p
      #  <fct>      <dbl> <dbl>
      #1 setosa      250.  28.6
      #2 versicolor  297.  33.9
      #3 virginica   329.  37.6
      

      【讨论】:

      • 它也可以,谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多