计算每个连续 运行 中的中位数
Calculating median in each consecutive run
我有一个 data.frame
如下;
df <- data.frame(ID = c(2,3,5,8,9,10,12,13,14,15,16),
value = c(1,2,3,4,5,6,7,8,9,10,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,9,10
、14,15,16,17
。对应的中位数应该是
> median(c(4,5,6))
[1] 5
> median(c(8,9,10,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
我有一个 data.frame
如下;
df <- data.frame(ID = c(2,3,5,8,9,10,12,13,14,15,16),
value = c(1,2,3,4,5,6,7,8,9,10,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,9,10
、14,15,16,17
。对应的中位数应该是
> median(c(4,5,6))
[1] 5
> median(c(8,9,10,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