R 使用加权平均和求和的变量列表,按组折叠数据帧

R 使用加权平均和求和的变量列表,按组折叠数据帧,r,group-by,dplyr,collapse,weighted-average,R,Group By,Dplyr,Collapse,Weighted Average,我想按组使用求和和和加权平均值折叠以下数据框。 我有以下数据框 group_id = c(1,1,1,2,2,3,3,3,3,3) var_1 = sample.int(20, 10) var_2 = sample.int(20, 10) var_percent_1 =rnorm(10,.5,.4) var_percent_2 =rnorm(10,.5,.4) weighting =sample.int(50, 10) df_to_collapse = data.frame(group_id,

我想按组使用求和和和加权平均值折叠以下数据框。

我有以下数据框

group_id = c(1,1,1,2,2,3,3,3,3,3)
var_1 = sample.int(20, 10)
var_2 = sample.int(20, 10)
var_percent_1 =rnorm(10,.5,.4)
var_percent_2 =rnorm(10,.5,.4)
weighting =sample.int(50, 10)

df_to_collapse = data.frame(group_id,var_1,var_2,var_percent_1,var_percent_2,weighting)
我想根据
group\u id
标识的组折叠数据。然而,在我的数据中,我有绝对水平的变量(
var\u 1
var\u 2
)和百分比(
var\u percent\u 1
var\u percent\u 2

我为每种类型的变量创建了两个列表(我的实际数据要大得多,这是必要的)。我还有一个加权变量(
加权

我的目标是根据变量的类型,使用eiter总和或加权平均值同时折叠数据(即,如果是百分比,则使用加权平均值)

以下是我最好的尝试:

 df_to_collapse %>% group_by(group_id) %>% summarise_at(.vars = c(to_be_summed_2,to_be_weighted_2), .funs=c(sum, mean))
但是,正如您所看到的,它不是加权平均值

我尝试了许多不同的方法来使用
加权.mean
功能,但都没有成功。这是一个这样的尝试的例子

df_to_collapse %>% group_by(group_id) %>% summarise_at(.vars = c(to_be_weighted_2,to_be_summed_2), .funs=c(weighted.mean(to_be_weighted_2, weighting), sum))
以及相应的错误:

Error in weighted.mean.default(to_be_weighted_2, weighting) : 
'x' and 'w' must have the same length

这里有一种方法可以实现这一点,它是将数据重塑为长数据,添加一个名为
type
的虚拟变量,用于判断它是否为百分比(可选,但很方便),根据它是否为百分比,在
summary
中应用一个函数,然后扩展回宽形状。如果您可以更改列名,您可以想出一种更优雅的方法来处理
类型
列,但这实际上更方便

我的窍门是
类型[1]=“百分比”
;我不得不使用
[1]
,因为每个组中的所有内容都具有相同的类型,但除此之外,
=
对向量中的每个值进行操作,并给出多个逻辑值,而实际上只需要1

库(tidyverse)
种子集(1234)
组id=c(1,1,1,2,2,3,3,3,3,3)
var_1=sample.int(20,10)
var_2=sample.int(20,10)
var_percent_1=rnorm(10、.5、.4)
var_百分数_2=rnorm(10、.5、.4)
加权=sample.int(50,10)
df_至_崩溃%
聚集(键=变量,值=值,-组id,-权重)%>%
突变(类型=ifelse(str_-detect(var,“percent”),“percent”,“int”))%>%
分组依据(分组id,变量)%>%
总结(总和或平均值=ifelse(类型[1]=“百分比”,加权。平均值(值,加权),总和(值)))%>%
解组()%>%
价差(键=var,值=总和或平均值)
#>#tibble:3 x 5
#>组id变量1变量2变量百分比1变量百分比2
#>                          
#> 1        1    26    31         0.269         0.483
#> 2        2    32    21         0.854         0.261
#> 3        3    29    49         0.461         0.262

由(v0.2.0)于2018-05-04创建。

在创建随机示例数据之前,您应该使用
set.seed
,这样我们都在看同一件事,并可以验证潜在的答案。无论如何,如果您愿意使用data.table,这听起来像是您所追求的
DT[,c(lapply(.SD[,…to_be_weighted_2],weighted.mean,w=weighted),lapply(.SD[,…待求和2],sum)),by=group\u id]
Perfect!非常感谢您的帮助(很抱歉花了这么长时间才将其标记为已回答!)
Error in weighted.mean.default(to_be_weighted_2, weighting) : 
'x' and 'w' must have the same length