如何用case_when在name与salary均为NA时将其替换为TRUE?
问题描述
需要编写条件语句(优先使用case_when函数),当数据框中的name和salary两个变量同时为NA时,将这两个变量的NA值替换为TRUE。示例数据框如下:
df <- data.frame( id = c (1:5), name = c("Rick","Dan","Michelle",NA,"Gary"), salary = c(623.3,515.2,611.0,NA,843.25), start_date = as.Date(c(NA, "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27")), stringsAsFactors = FALSE )
期望输出:
id name salary start_date 1 1 Rick 623.30 NA 2 2 Dan 515.20 2013-09-23 3 3 Michelle 611.00 2014-11-15 4 4 TRUE TRUE 2014-05-11 5 5 Gary 843.25 2015-03-27
尝试了以下代码但无法替换对应列的值:
case_when(is.na(df$name)& is.na(df$salary) ~TRUE)
解决方案
你的代码仅生成了一个逻辑向量,没有对原数据框的列执行赋值操作。同时要注意原列的数据类型:name是字符型,salary是数值型,直接替换为逻辑值TRUE会引发类型冲突,因此我们用字符串"TRUE"来匹配期望输出的格式。
使用dplyr的mutate函数配合case_when分别处理两列即可实现需求:
library(dplyr) df <- df %>% mutate( # 处理name列:仅当name和salary同时为NA时替换为"TRUE",其余保留原值 name = case_when( is.na(name) & is.na(salary) ~ "TRUE", TRUE ~ name ), # 处理salary列:先将原数值转为字符型,再替换目标值 salary = case_when( is.na(name) & is.na(salary) ~ "TRUE", TRUE ~ as.character(salary) ) ) # 查看结果 print(df)
关键说明
- 每个
case_when必须保留TRUE ~ 原变量的分支,确保未满足条件的行数据不被修改。 - 若希望
salary保留数值类型,仅在特定行显示TRUE,可以考虑将列转为字符型(如上代码),或者使用factor类型,但字符串形式最贴合你的期望输出。
内容的提问来源于stack exchange,提问作者Rara
相关产品推荐
相关产品推荐

