计算每次连续运行的中位数

问题描述

我有一个 data.frame 如下;

df <- data.frame(ID = c(2,3,5,8,9,10,12,13,14,15,16),value = c(1,2,4,6,7,11))
> df
   ID value
1   2     1
2   3     2
3   5     3
4   8     4
5   9     5
6  10     6
7  12     7
8  14     8
9  15     9
10 16    10
11 17    11

这里,我想获取 ID 连续时的中位数列表。比如前两行的ID显示的是2,3,是连续的。在这种情况下,我想获得前两行value的中位数,应该是

> median(c(1,2))
[1] 1.5

然后,下一个连续的 ID8,1014,16,17。对应的中位数应该是

> median(c(4,6))
[1] 5
> median(c(8,11))
[1] 9.5

那么,我最终想要的是像下面这样的data.frame

   ID   median
1   2    1.5
2   8    5
3  14    9.5

我想知道 rle 可能有用,但我不确定我是如何实现的。 你有什么建议来实施这个吗?如有任何建议,我将不胜感激。

解决方法

这是一个 data.table 选项

setDT(df)[,if (.N > 1) data.table(ID = min(ID),value = median(value)),.(grp = cumsum(c(TRUE,diff(ID) != 1)))
][,grp := NULL
][]

给出

   ID value
1:  2   1.5
2:  8   5.0
3: 12   9.0