You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dplyr弃用funs()后,summarise_if中n()报错的代码改写咨询

解决dplyr中funs()弃用后的代码更新问题

错误原因

你之前的代码报错是因为在list()里直接调用n()时,它不在dplyr的数据掩码上下文(mutate()/summarise()这类动词的核心执行环境)中;而用~n()的形式将其包装成lambda函数后,dplyr会在分组环境下正确执行该函数。另外,summarise_if这类scoped verbs已被软弃用,官方更推荐使用灵活度更高的across()语法。

正确代码(推荐使用across())

iris_means <- iris %>% 
  group_by(Species) %>% 
  summarise(
    # 对所有数值列批量应用多个函数,保留原列名+后缀的命名格式
    across(where(is.numeric), 
           list(N = ~n(), mean = mean, sd = sd, se = ~sd(.)/sqrt(n()))),
    .groups = "drop"  # 替代ungroup(),直接取消分组
  )

兼容旧版summarise_if的写法(不推荐)

如果暂时不想切换到across(),可以把每个函数都用公式形式包装:

iris_means <- iris %>% 
  group_by(Species) %>% 
  summarise_if(is.numeric, 
               list(N = ~n(), mean = mean, sd = sd, se = ~sd(.)/sqrt(n()))) %>% 
  ungroup()

说明

两种写法都会生成和原funs()版本完全一致的列名(比如Sepal.Length_N、Sepal.Length_mean等),且能正确计算每组的行数、均值、标准差和标准误。

内容的提问来源于stack exchange,提问作者user3490557

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:55:20