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

如何在R中按指定条件合并两列生成新列A?

解决R中合并x、y列生成新列A的问题

问题分析

你需要生成的新列A的规则本质是:取x和y中的较大值,当其中一列为NA时取非NA值,两列均为NA则返回NA。你之前的代码存在两个核心问题:

  • 判断NA不能用== NA,必须用is.na()函数(因为NA与任何值比较结果都是NA,无法触发条件);
  • 代码逻辑未覆盖两列均有值时取较大值的规则,且错误地将NA设为字符串"NA"而非真正的缺失值。

解决方案

方法1:用case_when逐条匹配规则

这种方法完全对应你列出的6条规则,逻辑清晰易懂:

library(dplyr)

df <- df %>%
  mutate(A = case_when(
    # 规则1:x为NA且y有值
    is.na(x) & !is.na(y) ~ y,
    # 规则2:y为NA且x有值
    !is.na(x) & is.na(y) ~ x,
    # 规则3:x>y取x
    x > y ~ x,
    # 规则4:y>x取y
    y > x ~ y,
    # 规则6:x=y取该值
    x == y ~ x,
    # 规则5:均为NA返回NA
    TRUE ~ NA_integer_
  ))

方法2:利用max特性简化代码

因为规则本质是取两列的最大值(自动覆盖规则3、4、6),只需额外处理NA的情况:

library(dplyr)

df <- df %>%
  rowwise() %>%
  mutate(A = if_all(c(x, y), is.na) ~ NA_integer_,
         TRUE ~ max(c(x, y), na.rm = TRUE)) %>%
  ungroup()
  • rowwise()确保按行计算最大值;
  • if_all(c(x,y), is.na)判断两列是否均为NA,是则返回NA;
  • max(..., na.rm=TRUE)会自动忽略单个NA,取非NA值,两列均有值时取较大值。

方法3:用pmax函数实现

pmax是向量化的逐行最大值函数,结合条件判断处理全NA情况:

library(dplyr)

df <- df %>%
  mutate(A = pmax(x, y, na.rm = TRUE),
         A = replace(A, if_all(c(x, y), is.na), NA_integer_))
  • pmax(x,y, na.rm=TRUE)逐行取最大值,单个NA时返回非NA值;
  • replace(...)将两列均为NA的行的A值替换为真正的NA(因为pmax处理全NA时会返回Inf,需要修正)。

验证结果

运行上述任意代码后,生成的A列将与你提供的示例完全一致:

+----+----+----+----+
| ID | x  | y  | A  |
+----+----+----+----+
|  1 | NA | 10 | 10 |
|  2 | 2  | NA | 2  |
|  3 | NA | NA | NA |
|  4 | 8  | 5  | 8  |
|  5 | 4  | 5  | 5  |
|  6 | 3  | 3  | 3  |
|  7 | NA | 4  | 4  |
|  8 | 7  | NA | 7  |
+----+----+----+----+

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:30:47