如何在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
相关产品推荐
相关产品推荐

