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

如何在R数据框中基于不同列组的行级条件定义新score列

解决方案:用dplyr生成符合规则的score列

你的原始代码问题在于,使用rowSums(x[c("x1","x2")]==1, na.rm=F)时,只要分组内存在NA(非全NA情况),rowSums会返回NA,导致后续逻辑判断出错。比如第五行x2为NA、x1为1时,x[c("x1","x2")]==1得到c(TRUE, NA),rowSums返回NA,最终这部分得分变成NA,和预期的1分不符。

下面是符合需求的dplyr实现,通过分步处理每个分组的得分,再计算总和:

library(dplyr)

# 原始数据框
x <- data.frame(x1 = c(NA, 1, 1, 0, 1 , NA),
                x2 = c(1, 1, 0, 0, NA, NA),
                x3 = c(1, NA, 0, NA, 0, NA),
                x4 = c(1, NA, 0, 0, 0, 1))

# 生成score列
x <- x %>%
  mutate(
    # 处理x1-x2分组的得分
    group1 = case_when(
      is.na(x1) & is.na(x2) ~ NA_real_,  # 全NA时返回NA
      x1 == 1 | x2 == 1 ~ 1,             # 任一为1得1分
      TRUE ~ 0                           # 其余情况得0分
    ),
    # 处理x3-x4分组的得分
    group2 = case_when(
      is.na(x3) & is.na(x4) ~ NA_real_,
      x3 == 1 | x4 == 1 ~ 1,
      TRUE ~ 0
    ),
    # 计算总分:只要任一分组为NA,总分即为NA
    score = rowSums(select(., group1, group2), na.rm = FALSE)
  ) %>%
  # 可选:删除中间分组列
  select(-group1, -group2)

# 查看结果
x

运行后得到的score列正好是预期的c(2, NA, 1, 0, 1, NA)。

逻辑说明

  1. 对每个分组单独处理:先判断是否全NA,再判断是否存在1,最后返回0分,彻底避免了NA对逻辑判断的干扰。
  2. 总分计算时,使用rowSums(na.rm = FALSE),确保只要任一分组为NA,总分就返回NA,符合你的规则要求。

内容的提问来源于stack exchange,提问作者rez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:07:31