我有一个数据集,我想在其中创建一个新变量,该变量是另一个变量的累积第二大值,并且我想按组执行此功能。
假设我创建了以下示例数据框:
(df1 <- data.frame(patient = rep(1:5, each=8), visit = rep(1:2,each=4,5), trial = rep(1:4,10), var1 = sample(1:50,20,replace=TRUE)))
这是假装数据,代表 5 名患者,每人有 2 次研究访问,每次访问有 4 次试验,并进行了测量 (var1)。> head(df1,n=20)
patient visit trial var1
1 1 1 1 25
2 1 1 2 23
3 1 1 3 48
4 1 1 4 37
5 1 2 1 41
6 1 2 2 45
7 1 2 3 8
8 1 2 4 9
9 2 1 1 26
10 2 1 2 14
11 2 1 3 41
12 2 1 4 35
13 2 2 1 37
14 2 2 2 30
15 2 2 3 14
16 2 2 4 28
17 3 1 1 34
18 3 1 2 19
19 3 1 3 28
20 3 1 4 10
我想创建一个新变量 cum2ndmax,它是 var1 的累积第二最大值,我想按患者 # 和访问 # 对该变量进行分组。我想出了如何计算累积的第二个最大值,如下所示:
df1$cum2ndmax <- sapply(seq_along(df1$var1),function(x){sort(df1$var1[seq(x)],decreasing=TRUE)[2]})
df1
但是,这会计算整个数据集的累积第二最大值,而不是每个组。在安装和加载包 dplyr 之后,我尝试使用分组数据来计算这个变量:library(dplyr)
df2 <- df1 %>%
group_by(patient,visit) %>%
mutate(cum2ndmax = sapply(seq_along(df1$var1),function(x){sort(df1$var1[seq(x)],decreasing=TRUE)[2]}))
但我收到一个错误:错误:mutate()
的问题输入 cum2ndmax
. x 输入 cum2ndmax
不能回收到尺寸 4。理想情况下,我的结果应该是这样的:
patient visit trial var1 cum2ndmax
1 1 1 25 NA
1 1 2 23 23
1 1 3 48 25
1 1 4 37 37
1 2 1 41 NA
1 2 2 45 41
1 2 3 8 41
1 2 4 9 41
2 1 1 26 NA
2 1 2 14 14
2 1 3 41 26
2 1 4 35 35
… … … … …
任何帮助使其在 R 中工作的帮助将不胜感激!谢谢!
最佳答案
一 dplyr
和 purrr
选项可以是:
df1 %>%
group_by(patient, visit) %>%
mutate(cum_second_max = map_dbl(.x = seq_along(var1),
~ ifelse(.x == 1, NA, var1[dense_rank(-var1[1:.x]) == 2])))
patient visit trial var1 cum_second_max
<int> <int> <int> <int> <dbl>
1 1 1 1 25 NA
2 1 1 2 23 23
3 1 1 3 48 25
4 1 1 4 37 37
5 1 2 1 41 NA
6 1 2 2 45 41
7 1 2 3 8 41
8 1 2 4 9 41
9 2 1 1 26 NA
10 2 1 2 14 14
11 2 1 3 41 26
12 2 1 4 35 35
13 2 2 1 37 NA
14 2 2 2 30 30
15 2 2 3 14 30
16 2 2 4 28 30
17 3 1 1 34 NA
18 3 1 2 19 19
19 3 1 3 28 28
20 3 1 4 10 28
关于r - 在 R 中查找每组的累积第二最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64538324/