问题描述
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
然后,下一个连续的 ID
是 8,10
,14,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