2016-10-05 21 views
0

只是好奇,如果有一个偷偷摸摸的方式来做到这一点,我失踪了。如何使用plyr计算data.frame中所有列的weighted.mean?

library(plyr) 
library(data.table) 

dfx <- data.frame(
    group = c(rep('A', 8), rep('B', 15), rep('C', 6)), 
    sex = sample(c("M", "F"), size = 29, replace = TRUE), 
    age = runif(n = 29, min = 18, max = 54) , 
    score = runif(n = 29) , 
    weight = sample(0:1 , 29 , replace = TRUE) 
) 

dt_dfx <- as.data.table(dfx) 

加权平均比较

# mean of all columns not specified in by= 
dt_dfx[ , lapply(.SD , mean) , by = .(sex,group) ] 

# here's how to match the data.table unweighted mean 
ddply(dfx, .(group,sex), numcolwise(mean)) 

不知道如何与plyr

# weighted.mean of all columns not specified in by= 
dt_dfx[ , lapply(.SD , weighted.mean , weight) , by = .(sex,group) ] 

# easy way to match the data.table weighted.mean? 

感谢所有

+0

protip:不要将'dfx'声明为'data.frame' - 只需使用'data.table',它将作为'data.table'出现。如果你从一个'data.frame'开始,你可以通过引用(无副本)和'setDT(dfx)'将其转换为'data.table'(不需要用'< - '重新分配) - 转换是在原地完成的。 – MichaelChirico

+1

,因为'plyr'对于这些类型的东西已经过时 - 谁在乎? – eddi

+0

我感觉XY问题... –

回答

1

这里是一个dplyr解决方案做到这一点,希望这有助于

dfx %>% 
group_by(sex , group) %>% 
summarize_each(funs(weighted.mean(. , weight)) , -weight) 
+0

嘿谢老虎 –

相关问题