R语言dplyr实现:按首次AKI标记匹配对应日期比较生成手术状态列
R 实现aki_status列生成方案
核心思路是逐行定位最早出现"aki"的列索引,匹配同序号的检测时间crdate和手术时间opstart做先后比较,可直接通过dplyr的mutate实现。
可直接运行的代码
library(dplyr) dat <- dat %>% rowwise() %>% mutate( # 从左到右找第一个值为"aki"的列位置 first_aki_idx = which(c_across(starts_with("aki_")) == "aki")[1], aki_status = case_when( is.na(first_aki_idx) ~ NA_character_, # 同位置crdate早于手术时间为preop,否则为postop c_across(starts_with("crdate_"))[first_aki_idx] < opstart ~ "preop", c_across(starts_with("crdate_"))[first_aki_idx] >= opstart ~ "postop" ) ) %>% ungroup()
结果核对
运行代码后,按照给定数据的逻辑,逐行判断结果为:
- 第1行:最早aki在
aki_1,对应crdate为2018-01-01 14:53,早于2018-01-03 09:00的手术时间,输出preop - 第2行:最早aki在
aki_3,对应crdate为2018-01-05 07:35,晚于2018-01-02 14:40的手术时间,输出postop - 第3行:最早aki在
aki_2,对应crdate为2018-01-01 14:43,早于2018-01-02 18:15的手术时间,输出preop - 第4行:所有aki列均为空值,输出
NA - 第5行:最早aki在
aki_1,对应crdate为2018-01-02 18:58,早于2018-01-03 11:40的手术时间,按规则应输出preop。如果这里的预期值是postop,可以检查下时间戳和列的映射关系是否存在笔误。
*注意:这套逻辑不需要硬编码列号,后续如果新增更多aki_n和对应的crdate_n列,只要保持命名的对应关系,代码可以自动适配,不需要修改判断逻辑。
内容的提问来源于stack exchange,提问作者Danielle
相关产品推荐
相关产品推荐

