如何计算一列不同行的百分比?

时间:2017-01-06 16:18:21

标签: r aggregate summary

我试图将这个值计算为职业和年份的百分比。例如,使用下面的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)
)

1 个答案:

答案 0 :(得分:2)

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

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