R 用可选列进行总结

问题描述 投票:0回答:1

我通过汇总创建了很多列,并删除了第二步中不需要的列。另一种选择是单独创建每一列,然后使用 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')

非常感谢! 罗兰

r conditional-statements summarize
1个回答
0
投票

如果您在列表中设置变量和关联条件,则可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.