如何用dplyr基于group_by分组生成新的trauma分类列
dplyr解决方案:生成trauma分组列
原始数据框df:
> df RECNUM diag.letter diag.number C_DIAG 1 A S 6 DS060 2 A T 15 DT151 3 A S 6 DS061A 4 B S 6 DS064 5 C S 6 DS061 6 C S 6 DS066 7 D S 2 DS020 8 D S 2 DS021
数据定义代码
df <- data.frame( RECNUM = c("A", "A", "A", "B", "C", "C", "D", "D"), diag.letter = c("S", "T", "S", "S", "S", "S", "S", "S"), diag.number = c(6, 15, 6, 6, 6, 6, 2, 2), C_DIAG = c("DS060", "DT151", "DS061A", "DS064", "DS061", "DS066", "DS020", "DS021") )
分组规则
- 按
RECNUM分组 - 若分组行数>1,且满足以下任一条件,标记为
Multi.TBI:- 组内所有行的
diag.letter == "S"且diag.number == 6 - 组内有多个行的
C_DIAG属于c("DS020", "DS021", "DS029", "DS071")
- 组内所有行的
- 若不满足上述条件,但组内存在
diag.letter为"T"的行,标记为Multitrauma - 其余情况标记为
Iso.TBI
dplyr解决方案代码
library(dplyr) df <- df %>% group_by(RECNUM) %>% mutate( # 统计组内符合指定C_DIAG的行数 tbi_count = sum(C_DIAG %in% c("DS020", "DS021", "DS029", "DS071")), # 判断是否符合Multi.TBI的判定条件 is_multi_tbi = n() > 1 & (all(diag.letter == "S" & diag.number == 6) | tbi_count >= 2), # 判断组内是否存在T类诊断 has_t = any(diag.letter == "T"), # 根据规则生成trauma列 trauma = case_when( is_multi_tbi ~ "Multi.TBI", has_t ~ "Multitrauma", TRUE ~ "Iso.TBI" ) ) %>% # 移除中间辅助计算列 select(-tbi_count, -is_multi_tbi, -has_t) %>% ungroup()
运行结果
> df # A tibble: 8 × 5 RECNUM diag.letter diag.number C_DIAG trauma <chr> <chr> <dbl> <chr> <chr> 1 A S 6 DS060 Multitrauma 2 A T 15 DT151 Multitrauma 3 A S 6 DS061A Multitrauma 4 B S 6 DS064 Iso.TBI 5 C S 6 DS061 Multi.TBI 6 C S 6 DS066 Multi.TBI 7 D S 2 DS020 Multi.TBI 8 D S 2 DS021 Multi.TBI
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

