我试图将这个值计算为职业和年份的百分比。例如,使用下面的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)
)
答案 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,因为这是我的工具;肯定有其他人(plyr
,data.table
)可能更适合某项任务。我仍然喜欢dplyr这个问题,但我提到了其他选项,因为总是值得考虑the best tool for the job。