【问题标题】:Calculating median in each consecutive run计算每次连续运行的中位数
【发布时间】:2021-04-08 20:06:03
【问题描述】:

我有一个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

那么,下一个连续的ID8,9,1014,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 可能有用,但我不确定我是如何实现它的。 你有什么建议来实施这个吗?如有任何建议,我将不胜感激。

【问题讨论】:

  • 您可以创建一个分组变量,如下所述:Create grouping variable for consecutive sequences and split vector。 (不需要拆分)。然后运行您最喜欢的“按组”功能。
  • 非常感谢您的评论。虽然我使用了另一个答案的方法,但是您提供的网址非常有帮助!
  • 不客气!如您所见,以下答案中使用了相同的成语:cumsum(...diff(。干杯。
  • 是的,我发现了这一点!非常感谢你。真诚的。

标签: r rle


【解决方案1】:

这是一个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.table,以后会多学习,因为看起来很有用。
猜你喜欢
  • 2020-12-26
  • 2013-10-17
  • 2019-10-24
  • 1970-01-01
  • 2016-12-03
  • 2020-05-18
  • 2021-05-08
  • 2022-12-15
  • 1970-01-01
相关资源
最近更新 更多