按组使用变量列表折叠数据框,以获得加权平均值和总和

时间:2018-05-04 17:50:07

标签: r group-by dplyr collapse weighted-average

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

我有以下数据框

const extractSass = new ExtractTextPlugin({
    filename: "[name].[chunkhash].css"
});

我想根据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_idvar_1)和百分比(var_2var_percent_1)的变量。

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

weighting

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

这是我最好的尝试:

to_be_weighted =df_to_collapse[, 4:5]
to_be_summed = df_to_collapse[,2:3]

to_be_weighted_2=colnames(to_be_weighted)
to_be_summed_2=colnames(to_be_summed) 

但是,正如您所看到的, 加权平均值

我尝试了许多使用 df_to_collapse %>% group_by(group_id) %>% summarise_at(.vars = c(to_be_summed_2,to_be_weighted_2), .funs=c(sum, mean)) 功能的不同方式,但没有运气。以下是一个这样的尝试的例子;

weighted.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))

1 个答案:

答案 0 :(得分:0)

这是一种方法,通过重新整形为长数据,添加一个名为type的虚拟变量来判断它是否是一个百分比(可选,但是很方便),根据它是否在summarise中应用一个函数一个百分比,然后扩散回广泛的形状。如果您可以更改列名称,则可以使用更优雅的方式执行type列,但这更方便。

我的诀窍是type[1] == "percent";我不得不使用[1],因为每个组中的所有内容都具有相同的类型,否则==会对向量中的每个值进行操作,并在您真正需要1时提供多个逻辑值。

library(tidyverse)

set.seed(1234)
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)

df_to_collapse %>%
    gather(key = var, value = value, -group_id, -weighting) %>%
    mutate(type = ifelse(str_detect(var, "percent"), "percent", "int")) %>%
    group_by(group_id, var) %>%
    summarise(sum_or_avg = ifelse(type[1] == "percent", weighted.mean(value, weighting), sum(value))) %>%
    ungroup() %>%
    spread(key = var, value = sum_or_avg)
#> # A tibble: 3 x 5
#>   group_id var_1 var_2 var_percent_1 var_percent_2
#>      <dbl> <dbl> <dbl>         <dbl>         <dbl>
#> 1        1    26    31         0.269         0.483
#> 2        2    32    21         0.854         0.261
#> 3        3    29    49         0.461         0.262

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