在R中按多条件筛选数据集:保留ABC定植患者最早日期行
R 数据集筛选实现方案
使用dplyr包(推荐,代码简洁直观)
先安装并加载dplyr:
install.packages("dplyr") library(dplyr)
执行筛选逻辑:
# 处理Disease=ABC且Class=Colonized的记录:按姓名分组保留最早日期的行 abc_colonized_filtered <- df %>% filter(Disease == "ABC" & Class == "Colonized") %>% group_by(First_Name, Last_Name) %>% slice_min(Spec_Date, n = 1) %>% ungroup() # 保留所有其他符合条件的记录 other_records <- df %>% filter(Disease != "ABC" | Class == "Clinical") # 合并得到最终数据集,可选排序对齐示例输出 df2 <- bind_rows(abc_colonized_filtered, other_records) %>% arrange(Disease, Class, First_Name, Last_Name)
逻辑说明
- 针对
Disease=ABC且Class=Colonized的记录,通过group_by按姓名分组,用slice_min提取每组中Spec_Date最早的单行。 - 直接筛选两类需保留的记录:非ABC疾病的所有记录,以及ABC疾病但Class为Clinical的记录。
- 合并两部分数据并排序,确保结果和示例输出一致。
Base R 实现方案(无需额外包)
# 提取ABC-Colonized子集并筛选最早日期的行 abc_colonized_subset <- df[df$Disease == "ABC" & df$Class == "Colonized", ] min_date_rows <- aggregate(Spec_Date ~ First_Name + Last_Name, data = abc_colonized_subset, FUN = function(x) which.min(x)) abc_colonized_filtered <- abc_colonized_subset[unlist(min_date_rows$Spec_Date), ] # 提取其他需保留的记录 other_records <- df[df$Disease != "ABC" | df$Class == "Clinical", ] # 合并数据并整理格式 df2 <- rbind(abc_colonized_filtered, other_records) df2 <- df2[order(df2$Disease, df2$Class, df2$First_Name, df2$Last_Name), ] row.names(df2) <- NULL # 重置行名避免混乱
逻辑说明
- 先提取目标子集,用
aggregate按姓名分组,找到每组中日期最早的行索引,再提取对应行。 - 提取其他符合条件的记录后合并,排序并重置行名,得到和示例一致的结果。
内容的提问来源于stack exchange,提问作者RazK
相关产品推荐
相关产品推荐

