在R中使用across()函数对多列求和时出现错误求助
问题分析与解决
数据与原代码
测试数据
Distance <- data.frame( DAY = c("1", "2","3") ,TEMP = c(25, 27, 26.5) ,C1Dist01 = c(1, 1, 1) ,C2Dist01 = c(1, 1, 0) ,C3Dist01 = c(1, 0,0) ,C4Dist01 = c(1, 0, 0) )
原求和代码
SumDistance<-Distance %>% rowwise() %>% mutate(CowSum = sum(across(select(ends_with("Dist01"))), na.rm = T))
错误信息
Error in
across():
! Must only be used inside data-masking verbs likemutate(),filter(), andgroup_by().
Backtrace:
- Distance %>% rowwise() %>% ...
- plyr::mutate(...)
- base::eval(cols[[col]], .data, parent.frame())
- base::eval(cols[[col]], .data, parent.frame())
- dplyr::across(select(ends_with("Dist01")))
错误原因
从回溯信息第2行可以看到,代码实际调用的是plyr::mutate而非dplyr::mutate。across是dplyr专属函数,仅支持在dplyr的数据掩码动词(如dplyr::mutate)中使用,而plyr版本的mutate完全不兼容该函数。
出现该问题的核心是你的环境中同时加载了plyr和dplyr包,且plyr的加载顺序晚于dplyr,导致mutate被plyr的版本覆盖;或是之前运行时dplyr的mutate优先级更高,现在环境发生了变化。
解决方法
方法1:明确指定dplyr::mutate
直接在代码中指定使用dplyr的mutate,同时简化across的写法(无需嵌套select):
SumDistance<-Distance %>% rowwise() %>% dplyr::mutate(CowSum = sum(across(ends_with("Dist01")), na.rm = TRUE))
方法2:移除plyr包的加载
如果不需要使用plyr包,直接卸载它避免命名空间冲突:
detach("package:plyr", unload = TRUE)
之后运行简化后的原代码即可:
SumDistance<-Distance %>% rowwise() %>% mutate(CowSum = sum(across(ends_with("Dist01")), na.rm = TRUE))
方法3:用rowSums替代(更高效)
行求和不需要依赖rowwise分组,直接用rowSums性能更优:
SumDistance <- Distance %>% mutate(CowSum = rowSums(select(., ends_with("Dist01")), na.rm = TRUE))
内容的提问来源于stack exchange,提问作者shrimp
相关产品推荐
相关产品推荐

