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(以及框架中的任何数量的变量)创建新的数据框.有人知道怎么做这个吗?谢谢
您可以在?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)
编辑:如果要对多个列执行操作,请使用colwise或numcolwise替代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)
它将计算每个数字字段的加权平均值,不包括权重本身.