我能使用 starts_with 对列进行分组吗?

7

我正在处理一个有很多列需要分组的大型数据框。我想做类似于这样的事情:

output <- df %>% 
  group_by(starts_with("GEN", ignore.case=TRUE),x,y) %>% 
  summarize(total=n()) %>% 
  arrange(desc(total))

有没有一种方法可以做到这一点?也许可以使用group_by_at或其他类似的函数吗?

1
你尝试使用group_by_at了吗?如果是这样,发生了什么?如果没有提供可重现的示例,那么很难做出比猜测更好的回答。我经常要提醒自己的一件事是,如果我尝试编写最终不起作用的代码,也不会发生什么坏事情——看起来你已经有了一个好的猜测,不妨试一试。 - camille
2个回答

9
要在 group_by() 中使用 starts_with(),你需要将其包装在 across() 中。下面是使用一些内置数据的示例。
library(dplyr)
mtcars %>%
group_by(across(starts_with("c"))) %>%
summarize(total = n()) %>%
arrange(-total)

# A tibble: 9 x 3
# Groups:   cyl [3]
    cyl  carb total
  <dbl> <dbl> <int>
1     4     2     6
2     8     4     6
3     4     1     5
4     6     4     4
5     8     2     4
6     8     3     3
7     6     1     2
8     6     6     1
9     8     8     1

3

是的,可以使用 group_by_at 函数:

mtcars %>% group_by_at(vars(starts_with("c"), gear))

按所有以 "c" 开头的列和列gear分组。

输出结果

# A tibble: 32 x 11
# Groups:   cyl, carb, gear [12]
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# ... with 22 more rows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接