【问题标题】:Is there an R function to calculate percentages?有没有计算百分比的R函数?
【发布时间】:2023-03-21 16:20:01
【问题描述】:

我有一个名为 crash_stats_TA 的 DF。

TA_code TA_name Crashes
061 Grey 126
062 Buller 345
063 Westland 24
064 Timaru 112

我正在尝试使用 mutate 创建一个名为 crash_perc 的新列。 这是我迄今为止尝试过的:

library(dplyr) # data manipulation

crash_stats_TA <- crash_stats_TA %>%
  group_by(TA_code, TA_name) %>%
  mutate(crashes_perc = round(Crashes/sum(Crashes, na.rm = T)*100,2))

但是,这会返回一个新的 crash_perc 列,每个 TA_code 和 TA_name 的值为 100,因此每个区域都有 100。像这样:

这是什么原因。 不太确定如何正确执行此步骤

【问题讨论】:

  • 根据显示的数据,您每组只有 1 次崩溃。因此它是 100%,即你 sum 返回相同的值。也许你的逻辑需要不同

标签: r dplyr percentage


【解决方案1】:

使用scales::percent

crash %>%
  mutate(crashes_perc = scales::percent(Crashes/sum(Crashes, na.rm = T)))

  TA_code TA_name  Crashes crashes_perc
    <int> <chr>      <int> <chr>       
1      61 Grey         126 20.8%       
2      62 Buller       345 56.8%       
3      63 Westland      24 4.0%        
4      64 Timaru       112 18.5% 

如果每组有足够的样本量,请添加group_by

【讨论】:

    【解决方案2】:

    100% 的原因是因为每个组只有值“Crashes”,sum 返回相同的值。相反,它应该没有任何分组

    library(dplyr)
    crash_stats_TA %>% 
      mutate(crashes_perc = round(Crashes/sum(Crashes, na.rm = TRUE)*100,2))
    

    -输出

    TA_code  TA_name Crashes crashes_perc
    1      61     Grey     126        20.76
    2      62   Buller     345        56.84
    3      63 Westland      24         3.95
    4      64   Timaru     112        18.45
    

    base R 中,使用proportions

    crash_stats_TA$crashes_perc <- with(crash_stats_TA, round(100 * 
             proportions(Crashes), 2))
    

    数据

    crash_stats_TA <- structure(list(TA_code = 61:64, TA_name = c("Grey", "Buller", 
    "Westland", "Timaru"), Crashes = c(126L, 345L, 24L, 112L)), 
    class = "data.frame", row.names = c(NA, 
    -4L))
    

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2012-09-16
      相关资源
      最近更新 更多