假设我有:
> 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$trauma
,它有三个级别:“Iso.TBI”、“Multi.TBI”和“Multitrauma”。
我在dplyr
中寻找解决方案
标准是:
(1)group_by(RECNUM)
或类似。
(2)如果df$RECNUM
有多个行(多个唯一RECNUM),并且所有这些行都包含diag.letter == "S"
和diag.number == 6
的组合,或者包含多个以下字符:C_DIAG %in% c("DS020", "DS021", "DS029", "DS071")
,然后多.TBI
(3)else if
diag.letter
包含“T”-无论有多少行,则Multi. traffic,
(4)否则等TBI
这里是预期输出
> df
RECNUM diag.letter diag.number C_DIAG trauma
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
数据
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")
)
2条答案
按热度按时间5sxhfpxr1#
这是
dplyr::mutate()
中dplyr::case_when
的一个很好的候选-注意case_when
一个接一个地计算,所以顺序很重要。这首先使用grepl
查找C_DIAG
中的任何“T”,因为这将覆盖任何其他逻辑。然后,在任何C_DIAG
中没有“T”的那些中,它执行您在(2)和(4)中描述的其余逻辑(注意:n()
提供RECNUM
的行数):输出量:
yyhrrdl82#
不确定所有嵌套是否正确,但这与您的结果匹配: