获取列中行子集的最大值

CJR*_*CJR 1 r dplyr tidyr

我有每个患者在不同时间具有不同值的ID长格式数据,使用tidyr::gather()看起来像这样:

ID    TIME    VALUE
1     10      14
1     20      34
1     30      35
2     10      15
2     20      14
2     30      11
3     10      16
3     20      64
3     30      55
Run Code Online (Sandbox Code Playgroud)

我想添加一个名为包含MAX每个患者达到 max 的时间的新列VALUE,如下所示:

ID    TIME    VALUE    MAX
1     10      14       30
1     20      34       30
1     30      35       30
2     10      15       10
2     20      14       10
2     30      11       10
3     10      16       20
3     20      64       20
3     30      55       20
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

ID    TIME    VALUE
1     10      14
1     20      34
1     30      35
2     10      15
2     20      14
2     30      11
3     10      16
3     20      64
3     30      55
Run Code Online (Sandbox Code Playgroud)

您对此有什么建议吗?

编辑:

错误信息:

ID    TIME    VALUE    MAX
1     10      14       30
1     20      34       30
1     30      35       30
2     10      15       10
2     20      14       10
2     30      11       10
3     10      16       20
3     20      64       20
3     30      55       20
Run Code Online (Sandbox Code Playgroud)

ID运行 .Rmd 脚本后,我在输出中针对不同的 s 重复看到此错误消息

编辑2:

为了简单起见,我删除了所有其他变量:

## 'data.frame'  : 1500 obs. of  13 variables:
##  $ ID         : chr  "pat1" "pat10" "pat100" "pat11" ...
##  $ TIME       : chr  "Time.0.15.h" "Time.0.15.h" "Time.0.15.h" "Time.0.15.h" ...
##  $ VALUE      : chr  "0" "0" "0" "0" ...
Run Code Online (Sandbox Code Playgroud)

请注意,大多数VALUE行都 > 0

akr*_*run 5

我们可以用来which.max创建一个数字索引,并在按“ID”分组后对相应的“TIME”进行子集化

library(dplyr)
data %>%
     group_by(ID) %>%
     mutate(MAX = TIME[which.max(VALUE)])
     # // if the column is not numeric, convert to numeric
     # mutate(MAX = TIME[which.max(as.numeric(VALUE))]) 
     # it may be better to convert it before that
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 9 x 4
# Groups:   ID [3]
#     ID  TIME VALUE   MAX
#  <int> <int> <int> <int>
#1     1    10    14    30
#2     1    20    34    30
#3     1    30    35    30
#4     2    10    15    10
#5     2    20    14    10
#6     2    30    11    10
#7     3    10    16    20
#8     3    20    64    20
#9     3    30    55    20
Run Code Online (Sandbox Code Playgroud)

数据

data <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), TIME = c(10L, 
20L, 30L, 10L, 20L, 30L, 10L, 20L, 30L), VALUE = c(14L, 34L, 
35L, 15L, 14L, 11L, 16L, 64L, 55L)), class = "data.frame", row.names = c(NA, 
-9L))
Run Code Online (Sandbox Code Playgroud)