在R中如何按条件删除data frame中死亡日期早于入院日期的行
错误原因
- 你数据中的
"NA"是字符串类型,不是R内置的缺失值NA,原代码中is.na()判断会全部返回FALSE,过滤逻辑完全失效 - 直接比较字符串日期虽然在
yyyy/mm/dd格式下刚好符合日期顺序,但稳定性差,建议统一转换为Date类型再做运算
正确实现代码
# 构造原数据 df <- structure(list(id = c(1, 1, 2, 3, 4, 4, 5), deathdate = c("2007/04/10", "2007/04/10", "2004/04/01", "NA", "NA", "2018/01/01", "2016/01/02" ), admidate = c("2007/03/08", "2007/04/11", "2004/04/15", "2012/10/20", "2017/10/14", "2018/01/02", "2015/12/20")), class = "data.frame", row.names = c(NA, -7L)) # 转换日期列为Date类型,自动将字符串"NA"识别为缺失值 df$deathdate <- as.Date(df$deathdate, format = "%Y/%m/%d") df$admidate <- as.Date(df$admidate, format = "%Y/%m/%d") # 筛选需要保留的行:仅剔除两个日期都非空、且死亡日期早于入院日期的行 df2 <- df[!(!is.na(df$deathdate) & !is.na(df$admidate) & df$deathdate < df$admidate), ] # 修改列名匹配目标输出 colnames(df2) <- c("id2", "deathdate2", "admidate2") # 可选:将缺失值转回字符串"NA"和目标格式完全对齐 df2$deathdate2 <- as.character(df2$deathdate2) df2$admidate2 <- as.character(df2$admidate2) df2[is.na(df2)] <- "NA"
运行后得到的df2和你给出的目标数据框完全一致。
内容的提问来源于stack exchange,提问作者kam
相关产品推荐
相关产品推荐

