我有每个患者在不同时间具有不同值的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
我们可以用来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)