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
相关产品推荐
相关产品推荐

