我是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)))
但是,我希望代码为x和x2(以及帧中的任何数量的变量)创建新的数据框。有人知道怎么做这个吗?感谢
答案 0 :(得分: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))
要为x
执行此操作,只需添加要传递到summarise
函数的那一行:
ddply(frame, .(class), summarise,
x = weighted.mean(x, weights),
x2 = weighted.mean(x2, weights))
修改:如果您要对多列进行操作,请使用colwise
或numcolwise
代替summarise
,或执行summarise
在melt
数据框中使用reshape2
包,然后cast
返回原始格式。 Here's an example.
这会给:
wmean.vars <- c("x", "x2")
ddply(frame, .(class), function(x)
colwise(weighted.mean, w = x$weights)(x[wmean.vars]))
最后,如果您不想指定wmean.vars
,您还可以执行以下操作:
ddply(frame, .(class), function(x)
numcolwise(weighted.mean, w = x$weights)(x[!colnames(x) %in% "weights"]))
将计算每个数字字段的加权平均值,不包括权重本身。
答案 1 :(得分:3)
有趣的data.table
答案,也不需要单独指定所有变量。
library(data.table)
frame <- as.data.table(frame)
keynames <- setdiff(names(frame),c("class","weights"))
frame[, lapply(.SD,weighted.mean,w=weights), by=class, .SDcols=keynames]
结果:
class x x2
1: B 0.1390808 -1.7605032
2: D 1.3585759 -0.1493795
3: C -0.6502627 0.2530720
4: E 2.6657227 -3.7607866