You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:03:35