r - 如何在 dplyr::across() 中使用 n() 按组计算行数?

标签 r dplyr across

在以前版本的 dplyr 中,如果我想使用 summarise() 获取除其他汇总值之外的行数,我可以做类似的事情

library(tidyverse)

df <- tibble(
    group = c("A", "A", "B", "B", "C"),
    value = c(1, 2, 3, 4, 5)
)

df %>%
    group_by(group) %>% 
    summarise(total = sum(value), count = n())

`summarise()` ungrouping output (override with `.groups` argument)

# A tibble: 3 x 3
  group total count
  <chr> <dbl> <int>
1 A         3     2
2 B         7     2
3 C         5     1
我本能地使用新 across() 获得相同的输出功能将是
df %>%
  group_by(group) %>% 
  summarise(across(value, list(sum = sum, count = n)))
Error: Problem with `summarise()` input `..1`.
x unused argument (col)
ℹ Input `..1` is `across(value, list(sum = sum, count = n))`.
ℹ The error occurred in group 1: group = "A".
该问题特定于 n()函数,只需调用 sum()按预期工作:
df %>%
  group_by(group) %>% 
  summarise(across(value, list(sum = sum)))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 3 x 2
  group value_sum
  <chr>     <dbl>
1 A             3
2 B             7
3 C             5
我尝试了各种语法变体(使用 lambdas,试验 cur_group() 等),但无济于事。我将如何在 across() 内获得所需的结果?

最佳答案

我们可以将 lambda 函数用于 n()sum如果没有要指定的其他参数,则可以通过调用它来调用

library(dplyr)
df %>%
  group_by(group) %>% 
  summarise(across(value, list(sum = sum, count = ~ n())), .groups = 'drop')
-输出
# A tibble: 3 x 3
#  group value_sum value_count
#  <chr>     <dbl>       <int>
#1 A             3           2
#2 B             7           2
#3 C             5           1

关于r - 如何在 dplyr::across() 中使用 n() 按组计算行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66161658/

相关文章:

r - 映射嵌套列并计算两组之间的 t 检验

r - 为什么 `mutate(across(...))` 和 `scale()` 将 [,1] 添加到列标题?

r - 以列名中的字符串为条件,从现有列中变异一个新列并粘贴值

r - 使用 mutate_all 和 across 时如何在 case_when 内添加列名?

R across 只找到正值或只找到负值 tidyverse

r - "fuzzy key matching"用于 data.table 合并

r - r 中 cat 输出的时间格式

r - ggplot2 - 获取图例中的注释

r - 可以关注多列时过滤行

r - 解析字符串计数并删除 r 中的不常见字符