Aggregate function in R with multiple function arguments

倖福魔咒の 提交于 2019-12-12 03:17:13

问题


I have sample data.set containing climate data for different seasons:

df <- data.frame(season=rep(1:5,2),year=rep(1:2,each=5),
      temp=c(2,4,3,5,2,4,1,5,4,3),ppt=c(4,3,1,5,6,2,1,2,2,2),
      samples=c(22,25,24,31,31,29,28,31,30,32))

I can determine the mean of my climate variables for each season for each year simply:

aggregate(df[,c('temp','ppt')], by = list(df$season,df$year), function(x) mean(x,na.rm=T))

However, I want to determine the weighted mean of each season|year combo using variable samples as my weights.

Essentially I want to replace my mean function in aggregate() with weighted.mean. That would require adding a second argument to my function that needs to change with my x.

    function(x,w) weighted.mean(x,w,na.rm=T))

Though, I'm not sure how to let the weight argument ('w') of weighted.mean() vary with each subset of the aggregated data.

Can I do this all within an aggregate function?

Any advice would be great!


回答1:


Try summarise_each from dplyr. It allows for the prior grouping with group_by and application to multiple columns:

library(dplyr)
df %>% group_by(season, year) %>%
        summarise_each(funs(weighted.mean(., samples,na.rm=T)), temp,ppt)
# Source: local data frame [10 x 5]
# Groups: season, year [10]
# 
#    season  year  temp   ppt samples
#    (int) (int) (dbl) (dbl)   (dbl)
# 1       1     1     2     4      22
# 2       2     1     4     3      25
# 3       3     1     3     1      24
# 4       4     1     5     5      31
# 5       5     1     2     6      31
# 6       1     2     4     2      29
# 7       2     2     1     1      28
# 8       3     2     5     2      31
# 9       4     2     4     2      30
# 10      5     2     3     2      32


来源:https://stackoverflow.com/questions/35001495/aggregate-function-in-r-with-multiple-function-arguments

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!