plyr包在多列上编写相同的函数

lin*_*inp 6 r plyr

我想使用ddply函数将相同的函数写入多个列,但我尝试继续将它们写在一行中,希望看到有更好的方法吗?

这是一个简单的数据版本:

data<-data.frame(TYPE=as.integer(runif(20,1,3)),A_MEAN_WEIGHT=runif(20,1,100),B_MEAN_WEIGHT=runif(20,1,10))
Run Code Online (Sandbox Code Playgroud)

我想通过这样做找出A_MEAN_WEIGHT和B_MEAN_WEIGHT列的总和:

ddply(data,.(TYPE),summarise,MEAN_A=sum(A_MEAN_WEIGHT),MEAN_B=sum(B_MEAN_WEIGHT))
Run Code Online (Sandbox Code Playgroud)

但在我目前的数据中,我有超过8个"*_MEAN_WEIGHT",而我已经厌倦了将它们写成8次

ddply(data,.(TYPE),summarise,MEAN_A=sum(A_MEAN_WEIGHT),MEAN_B=sum(B_MEAN_WEIGHT),MEAN_C=sum(C_MEAN_WEIGHT),MEAN_D=sum(D_MEAN_WEIGHT),MEAN_E=sum(E_MEAN_WEIGHT),MEAN_F=sum(F_MEAN_WEIGHT),MEAN_G=sum(G_MEAN_WEIGHT),MEAN_H=sum(H_MEAN_WEIGHT))
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来写这个?谢谢您的帮助!!

mne*_*nel 6

plyr-centred方法是使用colwise

例如

 ddply(data, .(TYPE), colwise(sum))
  TYPE A_MEAN_WEIGHT B_MEAN_WEIGHT
1    1      319.8977      60.80317
2    2      621.6745      37.05863
Run Code Online (Sandbox Code Playgroud)

.col 如果只需要子集,则可以将列名称作为参数传递

您也可以仅使用numcolwisecatcolwise操作数字或分类列.

请注意,您可以使用sapply代替最基本的用途colwise

ddply(data, .(TYPE), sapply, FUN = 'mean') 
Run Code Online (Sandbox Code Playgroud)

惯用的data.table方法是使用 lapply(.SD, fun)

例如

dt <- data.table(data)
dt[,lapply(.SD, sum) ,by = TYPE]
   TYPE A_MEAN_WEIGHT B_MEAN_WEIGHT
1:    2      621.6745      37.05863
2:    1      319.8977      60.80317
Run Code Online (Sandbox Code Playgroud)