R在不使用总结或滤波器的情况下,在观测子集中找到最大值



所有人,

我有下面的数据帧示例,包括患者的ID(1和2(、他们的类别X(是或否(和参数的值

df <- data.frame (ID = c (1, 1, 1, 1, 2, 2, 2),
X = c ("YES", "YES", "NO", "NO", "YES", "NO", "NO"),
Value = c (10, 15, 12, 13, 18, 16, 17))
df

这提供了下表:

ID   X Value
1  1 YES    10
2  1 YES    15
3  1  NO    12
4  1  NO    13
5  2 YES    18
6  2  NO    16
7  2  NO    17

我想得到一个新的列结果,它将给出每个患者对";"是";在X列中,如下

ID   X Value Result
1  1 YES    10     15
2  1 YES    15     15
3  1  NO    12     15
4  1  NO    13     15
5  2 YES    18     18
6  2  NO    16     18
7  2  NO    19     18

我知道我可以使用group_by和summary来获得值,但我想使用mutate,这样我就可以遵循我为这个项目构建的所有变量,出于同样的原因,避免使用filter函数。

下面的解决方案为我提供了结果列,但我再次希望每个ID只有一个值。

df %>%
group_by(ID,X)%>%
mutate (Result = max(Value))
ID X     Value Result
<dbl> <chr> <dbl>  <dbl>
1     1 YES      10     15
2     1 YES      15     15
3     1 NO       12     13
4     1 NO       13     13
5     2 YES      18     18
6     2 NO       16     19
7     2 NO       19     19

非常感谢您的帮助

您可以使用以下代码:

df %>% group_by(ID) %>% mutate(result = max(Value[X == "YES]))

使用data.table

library(data.table)
setDT(df)[, result := max(Value[X == "YES"], na.rm = TRUE), ID]

这个怎么样?

> transform(df, Result = ave(Value, ID, X, FUN = max))
ID   X Value Result
1  1 YES    10     15
2  1 YES    15     15
3  1  NO    12     13
4  1  NO    13     13
5  2 YES    18     18
6  2  NO    16     19
7  2  NO    19     19

最新更新