如何基于TypeAntibiotic列填充Antibiotics列空值且不覆盖已有值?
解决方法:仅填充
Antibiotics空值,不覆盖已有内容 我懂你的痛点——之前的代码会把所有TypeAntibiotic为BrandA的行都改成N,哪怕Antibiotics本来已经有Y的值,这显然不是你想要的。我们需要加一个前提条件:只在Antibiotics是空值的时候,才根据TypeAntibiotic的内容来填充。
方法1:嵌套ifelse精准判断
用dplyr的mutate结合嵌套条件,先检查Antibiotics是否为空,再判断TypeAntibiotic是否为BrandA:
library(dplyr) # 你的原始数据框 df <- data.frame(Names=c("Patient1","patient2","Patient3","Patient4","patient5"), Antibiotics=c("Y","N","Y","","Y"), TypeAntibiotic=c("","","BrandA","","BrandA")) # 执行填充操作 df <- df %>% mutate(Antibiotics = ifelse(Antibiotics == "" & grepl("BrandA", TypeAntibiotic), "N", Antibiotics))
方法2:用case_when提升可读性
如果后续有更多条件要扩展,case_when会让逻辑更清晰,同样能实现需求:
df <- df %>% mutate(Antibiotics = case_when( # 仅当Antibiotics为空且TypeAntibiotic是BrandA时,填充为N Antibiotics == "" & TypeAntibiotic == "BrandA" ~ "N", # 其他所有情况,保留原有的Antibiotics值 TRUE ~ Antibiotics ))
验证结果
运行代码后,你的数据框会变成这样:
print(df) # Names Antibiotics TypeAntibiotic # 1 Patient1 Y # 2 patient2 N # 3 Patient3 Y BrandA # 4 Patient4 # 5 patient5 Y BrandA
可以看到:
- Patient4的
Antibiotics是空值,但TypeAntibiotic不是BrandA,所以保持空 - patient5的
Antibiotics本来是Y,哪怕TypeAntibiotic是BrandA,也没有被修改 - 完全符合你“仅填充空值,不覆盖已有内容”的要求
内容的提问来源于stack exchange,提问作者Joe Crozier
相关产品推荐
相关产品推荐

