R语言dplyr中mutate_at以指定列为分子逐列计算报错
错误原因
mutate_at里用~定义匿名计算规则时,~必须放在整个计算表达式的最开头,用来告诉dplyr这是逐列执行的公式:.代表当前遍历到的列,你之前写的x3/ ~.把~放在了除法运算符后面,R无法识别为合法的函数定义,自然会报错。
正确代码
把~移到表达式最前面,将.放在分母位置即可:
library(dplyr) # 测试数据构造 x1<-rpois(20,5) x2<-rpois(20,5) x3<-rpois(20,2) df1<-data.frame(x1,x2,x3) # 计算x3逐列除以x1到x3的结果 df1 %>% mutate_at(vars(x1:x3), list(x3_by_all = ~x3/.))
运行后会新增3列:
x1_x3_by_all:值为x3/x1x2_x3_by_all:值为x3/x2x3_x3_by_all:值为x3/x3,结果恒为1
版本适配提示
如果你使用的是1.0.0及以上版本的dplyr,官方更推荐用across()搭配mutate()替代已经进入维护状态、不再新增功能的mutate_at(),写法逻辑完全一致:
df1 %>% mutate(across(x1:x3, list(x3_by_all = ~x3/.)))
如果你的列中存在0值,建议加一层容错避免出现无意义的Inf结果:
# 分母为0时返回NA df1 %>% mutate(across(x1:x3, list(x3_by_all = ~x3/ifelse(. == 0, NA, .))))
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

