如何基于R语言获取数据框中每个ID的最新阳性检测结果?
问题:获取每个ID对应的最新阳性检测结果
原始数据框
data <- data.frame(ID = c(174524, 175268, 176590), lab_info = c("RTPCR, RTPCR, RTPCR", "RTPCR, RTPCR, RTPCR, ANTIGEN, ANTIGEN", "RTPCR, RTPCR"), date_specimen_collected = c("09/25/2020, 01/05/2022, 05/03/2023", "07/09/2021, 10/27/2021, 05/04/2023, 07/07/2021, 07/09/2021"), lab_result = c("Positive, Positive, Positive", "Pending, Positive, Positive, Negative, Negative", "Positive, Positive"), date_result_received = c("01/01/1900, 01/07/2022, 05/04/2023", "01/01/1900, 10/28/2021, 05/04/2023, 07/07/2021, 07/09/2021", "07/18/2021, 05/05/2023"))
现有代码问题
现有代码仅筛选出阳性结果,但无法提取每个ID对应的最新标本采集日期的记录,且存在列名笔误、未处理分割后空格等问题。
修正后的代码
library(dplyr) library(stringr) FINAL_data <- data %>% # 修正列名:原始数据为lab_info,而非lab_info_type select(ID, lab_info, date_specimen_collected, lab_result, date_result_received) %>% # 按", "分割行,避免生成带前导空格的字符串 separate_rows(lab_info, lab_result, date_specimen_collected, date_result_received, sep = ", ") %>% # 筛选阳性结果,用str_trim处理可能的空格 filter(str_trim(lab_result) == "Positive") %>% # 转换日期格式,同时清理空格 mutate( date_specimen_collected = as.Date(str_trim(date_specimen_collected), "%m/%d/%Y"), date_result_received = as.Date(str_trim(date_result_received), "%m/%d/%Y") ) %>% # 按ID分组,提取每组中标本采集日期最新的1条记录 group_by(ID) %>% slice_max(date_specimen_collected, n = 1) %>% # 取消分组(可选,根据后续操作需求) ungroup()
关键调整说明
- 列名修正:原代码中
lab_info_type是笔误,原始数据框的对应列是lab_info,必须匹配才能正确分割。 - 分割符优化:使用
", "作为分隔符,直接避免分割后字符串出现前导空格;如果原始数据分隔符不统一,可搭配str_trim清理字符串。 - 日期处理:转换日期前用
str_trim清理空格,确保日期字符串格式正确,避免转换失败。 - 提取最新记录:分组后使用
slice_max(date_specimen_collected, n = 1)直接提取每组中日期最新的阳性记录,比arrange后slice(1)更高效直观。
输出结果
运行后FINAL_data会得到每个ID对应的最新阳性检测记录:
# A tibble: 3 × 5 ID lab_info date_specimen_collected lab_result date_result_received <dbl> <chr> <date> <chr> <date> 1 174524 RTPCR 2023-05-03 Positive 2023-05-04 2 175268 RTPCR 2023-05-04 Positive 2023-05-04 3 176590 RTPCR 2023-05-04 Positive 2023-05-05
内容的提问来源于stack exchange,提问作者jshar
相关产品推荐
相关产品推荐

