dplyr行求和时where(is.numeric)失效问题求助
问题解决:行方向求和数值型变量
你的代码里sum(where(is.numeric))无效的原因是:where(is.numeric)是dplyr的列选择语法,仅能在支持tidy select的函数(比如select()、across())中使用,sum()本身不识别这个语法,所以无法正确筛选列进行求和。
下面提供两种可行的解决方法:
方法1:使用rowwise() + c_across()
在rowwise()的上下文里,用c_across()包裹列选择器,就能正确选取每行的数值型列并求和:
library(dplyr) vital1 <- data.frame( a_team = c(1:3), b_team = c(2:4), team_league = c('dd','ee','ff'), c_team = c(5,9,1) ) %>% rowwise() %>% mutate(league_points = sum(c_across(where(is.numeric)), na.rm = TRUE)) %>% ungroup() # 完成行操作后取消分组,避免后续操作性能下降
c_across()是dplyr专门为行级操作设计的函数,支持tidy select语法- 加上
na.rm = TRUE可以避免因缺失值导致求和结果为NA(可选,根据你的数据情况调整)
方法2:使用rowSums()(更高效)
如果你的数据集较大,rowwise()的性能会比较差,推荐直接用rowSums()配合select()筛选数值列:
library(dplyr) vital1 <- data.frame( a_team = c(1:3), b_team = c(2:4), team_league = c('dd','ee','ff'), c_team = c(5,9,1) ) %>% mutate(league_points = rowSums(select(., where(is.numeric)), na.rm = TRUE))
select(., where(is.numeric))先筛选出所有数值型列rowSums()直接对筛选后的列做行方向求和,无需分组,运行速度更快
内容的提问来源于stack exchange,提问作者jkatam
相关产品推荐
相关产品推荐

