我通过汇总创建了很多列,并删除了第二步中不需要的列。另一种选择是单独创建每一列,然后使用 join 将它们连接起来,这可能不会更快。
程序代码目前如下所示:
Data <- Data %>%
group_by_at(group_by_Vektor) %>%
summarize(var_1 = sum(var_1),
var_2 = sum(var_2),
...
var_n = sum(var_n),
.groups = 'drop')
if (!condition_1) {
Data <- select(Data, -var_1))
}
if (!condition_2) {
Data <- select(Data, -var_2))
}
...
if (!condition_n) {
Data <- select(Data, -var_2))
}
我正在寻找这样的东西:
Data <- Data %>%
group_by_at(group_by_Vektor) %>%
summarize(if(condition_1, var_1 = sum(var_1)),
if(condition_2, var_2 = sum(var_2),
...
if(condition_n, var_n = sum(var_n)),
.groups = 'drop')
非常感谢! 罗兰
如果您在列表中设置变量和关联条件,则可以使用
mapply
,然后使用 inner_join
合并结果。
假设您的数据如下所示:
df <- data.frame(group_by_Vektor=rep(1:2, each=5),
var_1=1:10, var_2=2:11, var_3=3:12)
df
group_by_Vektor var_1 var_2 var_3
1 1 1 2 3
2 1 2 3 4
3 1 3 4 5
4 1 4 5 6
5 1 5 6 7
6 2 6 7 8
7 2 7 8 9
8 2 8 9 10
9 2 9 10 11
10 2 10 11 12
设置变量和条件:
vars <- list('var_1', 'var_2', 'var_3')
Conditions <- list(TRUE, FALSE, TRUE)
创建自定义函数
f <- function(var, value) {
if(value) df |>
group_by(group_by_Vektor) |>
summarise_at(vars(var), sum)
}
然后使用变量和条件调用此函数,然后将它们合并在一起。
sum_df <- mapply(function(x, y) f(x, y), vars, Conditions)
Reduce(inner_join, Filter(Negate(is.null), sum_df))
# A tibble: 2 × 3
group_by_Vektor var_1 var_3
<int> <int> <int>
1 1 15 25
2 2 40 50