R语言数据框多条件赋值时使用ifelse避免生成NA的方法
解决方案
你要实现按顺序赋值多条件、不满足条件的行留空不产生NA,有两种常用实现方式,都可以直接适配你15个条件逐个手动添加的需求:
方法1:基础R直接按条件赋值(最符合你逐次手动赋值的要求)
先初始化新增列为空字符串,之后每次只给满足对应条件的行赋值,不满足的行会保留原有空值,全程不会产生NA:
# 第一步:先初始化Names列为空 df$Names <- "" # 按顺序逐个添加条件赋值即可 # 第一个条件 df$Names[df$Start >=1 & df$Stop <=5] <- "name" # 第二个条件 df$Names[df$Start >=5 & df$Stop <=10] <- "name2" # 剩余13个条件直接按照上述格式依次添加即可,前面的赋值会被后面同范围的条件覆盖,符合你按顺序执行的要求
方法2:dplyr::case_when(多条件写法更整洁)
如果可以用tidyverse套件,case_when对多条件的支持更友好,不需要嵌套ifelse,最后指定TRUE ~ ""即可让所有不满足条件的行返回空值,不会出现NA:
library(dplyr) df <- df %>% mutate(Names = case_when( # 按优先级从上到下写你的15个条件即可 Start >= 1 & Stop <=5 ~ "name", Start >=5 & Stop <=10 ~ "name2", # 其余13个条件按顺序写在这里 TRUE ~ "" # 所有不满足上述条件的行返回空字符串 ))
原代码问题说明
- 你用单
if加&&的写法没有效果,是因为&&是标量逻辑运算符,只会判断向量的第一个元素,返回单个TRUE/FALSE,不会按行做向量化判断,多条件按行判断需要用单个&。 - 原来的ifelse写法如果不想返回NA,把第三个参数换成
""即可,但15个条件嵌套ifelse可读性非常差,不推荐使用。
运行上述两种方法得到的结果和你预期的完全一致:
Start Stop Names 1 1 2 name 2 2 3 name 3 3 4 name 4 4 5 name 5 5 6 name2 6 6 7 name2 7 7 8 name2 8 8 9 name2 9 9 10 name2 10 10 11
内容的提问来源于stack exchange,提问作者Maike
相关产品推荐
相关产品推荐

