如何在R语言DataFrame中基于多条件生成新列CANCER_YEAR
在R的DataFrame中根据多列条件生成新列CANCER_YEAR
你可以通过以下几种方式实现多条件判断,解决之前代码中覆盖已有值的问题:
方法1:基础R分步赋值(直观可控)
先初始化新列为NA,再按条件依次赋值,确保已匹配的有效值不会被后续条件覆盖:
# 初始化新列为NA df$CANCER_YEAR <- NA # 匹配cancer_1类型列时,赋值对应的cancer_1_year match_cancer1 <- df$cancer_1_type_m == 3 | df$cancer_1_type_f == 3 df$CANCER_YEAR[match_cancer1] <- df$cancer_1_year[match_cancer1] # 仅对未匹配的行,匹配cancer_2类型列并赋值对应的cancer_2_year match_cancer2 <- is.na(df$CANCER_YEAR) & (df$cancer_2_type_m == 3 | df$cancer_2_type_f == 3) df$CANCER_YEAR[match_cancer2] <- df$cancer_2_year[match_cancer2]
如果需要调整优先级(比如优先保留cancer_2的年份),只需要调换两步赋值的顺序即可。
方法2:基础R嵌套ifelse(简洁写法)
用嵌套ifelse一次性完成多条件判断:
df$CANCER_YEAR <- ifelse(df$cancer_1_type_m == 3 | df$cancer_1_type_f == 3, df$cancer_1_year, ifelse(df$cancer_2_type_m == 3 | df$cancer_2_type_f == 3, df$cancer_2_year, NA)) # 无匹配时设为NA,可根据需求改为0或其他值
方法3:dplyr的case_when(清晰的多条件语法)
如果习惯tidyverse风格,case_when能更直观地编写多分支逻辑:
library(dplyr) df <- df %>% mutate(CANCER_YEAR = case_when( cancer_1_type_m == 3 | cancer_1_type_f == 3 ~ cancer_1_year, cancer_2_type_m == 3 | cancer_2_type_f == 3 ~ cancer_2_year, TRUE ~ NA_real_ # 无匹配时返回NA,可替换为0等其他值 ))
验证结果
运行以上代码后,CANCER_YEAR列的结果如下:
[1] 2001 2003 2004 1997 1987 1999 2001 1978 NA
完全匹配示例数据的逻辑:
- id1-4:
cancer_1_type_m=3→ 取cancer_1_year - id5-6:
cancer_1_type_f=3→ 取cancer_1_year - id7:
cancer_2_type_f=3→ 取cancer_2_year - id8:
cancer_2_type_m=3→ 取cancer_2_year - id9:无匹配列等于3 → 为NA
内容的提问来源于stack exchange,提问作者Jérôme Fortier
相关产品推荐
相关产品推荐

