如何使用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
相关产品推荐
相关产品推荐

