基于列条件创建新列:R语言数据框处理问题
解决R语言数据框生成hf2列的问题
问题分析
从你给出的期望结果来看,hf2的生成规则可明确为:
- 当
hf为"1"时,无论hf1取值(包括"NA"),hf2为"1" - 当
hf为"0"且hf1为"1"时,hf2为"1" - 当
hf为"0"且hf1为"0"时,hf2为"0"
你之前的代码逻辑完全偏离需求:+(!(df$hf1 == 1 & df$hf1 == 1))本质是判断hf1是否不等于1,再转成数值,这和你要的规则完全不符,所以会出现错误结果。
正确实现方法
方法1:基础R的ifelse嵌套
df$hf2 <- ifelse(df$hf == "1", "1", ifelse(df$hf == "0" & df$hf1 == "1", "1", "0"))
方法2:逻辑表达式直接生成
满足hf2为1的条件是hf == "1" 或者 (hf == "0"且hf1 == "1"),直接将该逻辑判断转换为字符型结果:
df$hf2 <- as.character(as.integer(df$hf == "1" | (df$hf == "0" & df$hf1 == "1")))
方法3:dplyr包的case_when(适配复杂规则场景)
如果习惯使用tidyverse工具链,可采用更直观的分支判断:
library(dplyr) df <- df %>% mutate(hf2 = case_when( hf == "1" ~ "1", hf == "0" & hf1 == "1" ~ "1", TRUE ~ "0" ))
验证结果
运行任意一种代码后,数据框会与你期望的结果一致:
| subject_id | hf | hf1 | hf2 |
|---|---|---|---|
| 191-5467 | 1 | NA | 1 |
| 191-6784 | 0 | 1 | 1 |
| 191-3457 | 0 | 1 | 1 |
| 191-0987 | 0 | 1 | 1 |
| 191-1245 | 1 | NA | 1 |
| 191-2365 | 0 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Thandi
相关产品推荐
相关产品推荐

