【问题标题】:How to calculate the percentage in different rows of one column?如何计算一列不同行的百分比?
【发布时间】:2017-01-06 16:18:20
【问题描述】:

我正在尝试将价值计算为职业和年份的百分比。例如,使用下面的df,第一行的百分比将是:

665 /(665+709) = 48.4

我能够使用聚合来计算平均值,但我不知道如何计算百分比:aggregate(x=df$value, by=list(df$occupation, df$year),FUN = mean)

df <- data.frame(
  year = c(rep(2003, 8), rep(2005, 8)),
  sex = c(rep(0, 4), rep(1, 4)),
  occupation = rep(c(1:4), 4),
  value = c(665, 661, 695, 450, 709, 460, 1033, 346, 808, 959, 651, 468, 756, 832, 1140, 431)
)

【问题讨论】:

标签: r aggregate summary


【解决方案1】:

我认为您正在寻找的答案是:

aggregate(
  x = df$value,
  by = list(df$occupation, df$year),
  FUN = function(x) {
    round(x / sum(x) * 100, 1)
  }
)

基本上,答案的关键在于FUN 参数;要计算百分比,您需要一个函数来告诉 R 在聚合时要做什么。由于 R 具有内置的均值函数,因此您可以在计算均值时将 mean 提供给 FUN。 Hadley Wickham 的 Advanced R 的 functional programming chapter 有更多关于构建命名函数和匿名函数的详细信息。

也就是说,对于像这样的数据操作任务,像 dplyr 这样的包确实非常擅长使任务变得不那么复杂并且更易于阅读。您可以使用上面的汇总答案,但除非您有理由(例如构建一个包并且您想避免依赖关系),否则附加包可以使您的代码更具可读性和可维护性。

library(dplyr)
output <- 
  df %>%
  group_by(year, occupation) %>%
  mutate(percent = round(value / sum(value) * 100, 1))

这种方法的另一个好处是它可以在原始数据结构中添加一个 比聚合更干净的方式,默认情况下会产生可用但不漂亮的结果。

这个vignette 有很多这些类型的数据操作任务的很好的例子。 dplyr/tidyr cheatsheet 对这类任务也很有帮助。

我的答案依赖于 dplyr,因为它是我的首选工具;肯定还有其他(plyrdata.table)可能更适合特定任务。对于这个问题,我仍然喜欢 dplyr,但我提到了其他选项,因为它总是值得考虑 the best tool for the job

【讨论】:

  • 非常感谢!你真是太好了!我是R的新手,你的回答对我很有帮助!
猜你喜欢
  • 2022-06-23
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多