根据小组,我想使用求和和加权平均值折叠以下数据框。
我有以下数据框
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_id
,var_1
)和百分比(var_2
,var_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))
答案 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。