You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:45:02