首页 > 解决方案 > 为什么这个(分组的)mutate_at 语法有效但 summarise_at 失败?

问题描述

示例数据:

(tmp_df <-
    expand.grid(id = letters[1:3], y = 1:3))
#    id y
# 1  a 1
# 2  b 1
# 3  c 1
# 4  a 2
# 5  b 2
# 6  c 2
# 7  a 3
# 8  b 3
# 9  c 3

以下作品:

tmp_df %>%
    group_by(id) %>%
    mutate_at(which(colnames(.) %in% c("y")),
              sum)
#   id        y
#   <fct> <int>
# 1 a         6
# 2 b         6
# 3 c         6
# 4 a         6
# 5 b         6
# 6 c         6
# 7 a         6
# 8 b         6
# 9 c         6

但以下引发错误Error: Only strings can be converted to symbols

tmp_df %>%
    group_by(id) %>%
    summarise_at(which(colnames(.) %in% c("y")),
              sum)

请注意,以下代码片段是成功生成预期结果的替代方法:

tmp_df %>%
    group_by(id) %>%
    summarise_at(vars(y),
                 sum)


tmp_df %>%
    group_by(id) %>%
    summarise_at("y",
                 sum)

编辑:按照 akrun 的回答,我应该注意我使用的 dplyr 版本是dplyr_0.8.4

标签: rdplyr

解决方案


似乎在mutate_at列号中包含了分组变量,但summarize_at它们并没有像下面的两行代码一样工作。尽管 _at 函数已被across我不知道是否会修复,但您可以报告此错误。

tmp_df %>% group_by(id) %>% mutate_at(2, sum)

tmp_df %>% group_by(id) %>% summarize_at(1, sum)

如果我们交换列,那么它们都会一致地工作,因为分组变量不再影响 y 列的位置,这一事实进一步强化了这一点。

tmp_df[2:1] %>% group_by(id) %>% mutate_at(1, sum)

tmp_df[2:1] %>% group_by(id) %>% summarize_at(1, sum)

推荐阅读