R在不使用汇总或过滤器的情况下查找观察子集中的最大值

R Finding the maximum value in subsets of observations without using summarise or filter

各位,

我有以下数据框示例,其中包含患者的 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

这提供了以下内容table:

  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 和 summarize 来获取值,但我想使用 mutate 以便我可以遵循我为这个项目构建的所有变量,并且出于同样的原因, 避免过滤功能。

以下解决方案为我提供了结果列,但同样我希望每个 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]))

这个呢?

> 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

使用data.table

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