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

如何使用R仅删除数据框中指定列包含NA值的对应记录

R实现按分组删除特定列含NA值的记录

前置说明

你提供的示例数据中,admission、discharged列的缺失值为字符串格式的"NA",不是R可识别的标准缺失值NA,处理前需要先做转换。

方法1:使用dplyr包(tidyverse生态,代码可读性高)

完整代码:

# 加载依赖包
library(dplyr)

# 构造输入数据
df <- structure(list(id = c(1, 1, 2, 2), 
                     admission = c("2001/01/01", "2001/03/01", "NA", "2005/01/01"), 
                     discharged = c("2001/01/07", "NA", "NA", "2005/01/03")), 
                class = "data.frame", row.names = c(NA, -4L))

# 第一步:将字符串"NA"转为标准缺失值
df[df == "NA"] <- NA

# 第二步:按id分组,筛选两列都无NA的行,每组取第一条,重命名列符合输出要求
result <- df %>%
  group_by(id) %>%
  filter(!is.na(admission) & !is.na(discharged)) %>%
  slice(1) %>%
  ungroup() %>%
  rename(id2 = id,
         admission2 = admission,
         discharged2 = discharged)

# 查看结果
print(result)

输出验证:

运行后得到的result结构和你给出的预期输出完全一致。

方法2:使用base R实现(无需额外安装包)

完整代码:

# 构造输入数据
df <- structure(list(id = c(1, 1, 2, 2), 
                     admission = c("2001/01/01", "2001/03/01", "NA", "2005/01/01"), 
                     discharged = c("2001/01/07", "NA", "NA", "2005/01/03")), 
                class = "data.frame", row.names = c(NA, -4L))

# 转换字符串"NA"为标准缺失值
df[df == "NA"] <- NA

# 筛选两列都无NA的行
valid_df <- df[!is.na(df$admission) & !is.na(df$discharged), ]
# 按id去重,保留每个id的第一条记录
result <- valid_df[!duplicated(valid_df$id), ]
# 重命名列
colnames(result) <- c("id2", "admission2", "discharged2")

# 查看结果
print(result)

内容的提问来源于stack exchange,提问作者kam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:36:06