2

我正在处理一个大数据框,该数据框有许多我想要分组的列。我想做这样的事情:

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

有没有办法做到这一点?也许使用 group_by_at 或其他类似功能?

4

2 回答 2

4

要在 中使用starts_with()group_by()您需要将其包装在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
于 2020-09-28T19:06:45.857 回答
2

就在这里。您可以使用以下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
于 2020-09-28T19:12:29.187 回答