R语言基于行条件更新Dataframe列 行和大于1修正时的报错解决
报错原因
你的代码存在三个核心问题:
across()内部的.指代的是当前正在遍历的单列数据,不是整个数据框的数值列,因此rowSums(.)是对单列计算行和,逻辑完全不符合预期- 计算行和时没有排除非数值类型的
product列,非数值列传入rowSums()就会触发'x' must be numeric的类型错误 across的第二个参数需要传入函数或公式对象,你直接传入if_else表达式没有包装为函数,语法不符合dplyr的要求
修复后的实现代码
方案1:适配“数值被翻倍”的场景(行和大于1则所有数值列除以2)
library(dplyr) test %>% mutate( across(where(is.numeric), ~ if_else(rowSums(across(where(is.numeric))) > 1, .x / 2, .x)) )
运行后输出结果如下:
product a b c 1 First 0.2 0.4 0.4 2 Second 0.1 0.1 0.8 3 Third 0.1 0.1 0.8
第三行数值列加和为1,符合需求。
方案2:通用场景(无论行和超出多少,都强制调整为1)
如果不确定错误行是仅被翻倍,只要行和不等于1就统一归一化,可以用更通用的写法:
library(dplyr) test %>% mutate( across(where(is.numeric), ~ .x / rowSums(across(where(is.numeric)))) )
这种写法会自动把所有行的数值列和调整为1,不需要提前判断行和大小。
内容的提问来源于stack exchange,提问作者Godrim
相关产品推荐
相关产品推荐

