如何使用ddply获取数据帧中类的加权平均值?

cod*_*art 2 r summarization weighted-average plyr reshape

我是plyr的新手,想要在类中取值的加权平均值来重塑多个变量的数据帧.使用以下代码,我知道如何为一个变量执行此操作,例如x2:

set.seed(123)
frame <- data.frame(class=sample(LETTERS[1:5], replace = TRUE),
                    x=rnorm(20), x2 = rnorm(20), weights=rnorm(20))
ddply(frame, .(class),function(x) data.frame(weighted.mean(x$x2, x$weights)))       
Run Code Online (Sandbox Code Playgroud)

但是,我希望代码为x和x2(以及框架中的任何数量的变量)创建新的数据框.有人知道怎么做这个吗?谢谢

Fra*_*ank 8

您可以在?summarise函数中找到所需内容.我可以使用summarise以下代码复制您的代码:

library(plyr)
set.seed(123)
frame <- data.frame(class=sample(LETTERS[1:5], replace = TRUE), x=rnorm(20), 
                    x2 = rnorm(20), weights=rnorm(20))
ddply(frame, .(class), summarise, 
      x2 = weighted.mean(x2, weights)) 
Run Code Online (Sandbox Code Playgroud)

要做到这一点x,只需添加要传递给summarise函数的那一行:

ddply(frame, .(class), summarise, 
      x = weighted.mean(x, weights),
      x2 = weighted.mean(x2, weights)) 
Run Code Online (Sandbox Code Playgroud)

编辑:如果要对多个列执行操作,请使用colwisenumcolwise替代summarise,或summarise对包中的melted数据框执行操作reshape2,然后cast返回原始格式.这是一个例子.


这会给:

wmean.vars <- c("x", "x2")

ddply(frame, .(class), function(x)
      colwise(weighted.mean, w = x$weights)(x[wmean.vars]))
Run Code Online (Sandbox Code Playgroud)

最后,如果您不想指定wmean.vars,您还可以:

ddply(frame, .(class), function(x)
      numcolwise(weighted.mean, w = x$weights)(x[!colnames(x) %in% "weights"]))
Run Code Online (Sandbox Code Playgroud)

它将计算每个数字字段的加权平均值,不包括权重本身.