1

我的数据框中有两列,左列表示 id,右列包含递增的整数,有些是连续的,有些不是。没有重复的整数。我的目标是获得每个连续整数的平均数id 例如:

这是我的数据集的片段

station summary id

> 数据
      身份时刻
4448 1 11725
4540 1 11726
5457 1 11739
5519 1 11740
11733 1 11861
11797 1 11862
12020 1 11865
12313 1 11869
14576 1 11914
23314 1 12088
166 2 11644
278 2 11646
339 2 11647
407 2 11648
476 2 11649
545 2 11650
673 2 11652
737 2 11653
982 2 11657
1035 2 11658

在上面的示例中,id 1具有以下连续整数个数moment- 2, 2, 2, 1, 1, 1, 1 - 所以平均值为 1.428

id 2在 - 1, 5, 2, 2 中具有以下连续整数个数moment- 所以平均值为 2.5

真正的数据集有大约 200 行和 300 个唯一 ID——我想要每个 ID 的平均值。

我知道您必须以某种方式使用 rle() 函数,并且我可以使用以下代码找到最大数量:

聚合(数据$时刻,数据['id'],FUN=函数(d)最大(rle(差异(d))$长度)) 

如何取平均值?

> 输入(数据)
结构(列表(id = c(1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 力矩 = c(11725L, 11726L,
11739L、11740L、11861L、11862L、11865L、11869L、11914L、12088L、
11644L, 11646L, 11647L, 11648L, 11649L, 11650L, 11652L, 11653L,
11657L, 11658L)), .Names = c("id", "moment"), row.names = c(4448L,
4540L、5457L、5519L、11733L、11797L、12020L、12313L、14576L、
23314L、166L、278L、339L、407L、476L、545L、673L、737L、982L、
1035L), 类 = "data.frame")
4

1 回答 1

3

可能有更好的方法,但是...

aggregate(data$moment,list(data$id), function(x) mean(rle(diffinv(diff(x)!=1))$lengths))
#   Group.1        x
# 1       1 1.428571
# 2       2 2.500000

解释

我们先拿差价。然后我们寻找那些不连续的数字(diff(x)!=1)。然后我们取差的倒数 ( diffinv) 回到原来的长度。我们现在有一个在非连续数字时递增的向量。采取rle这一点,然后是 lenghts 最后 apply mean,你就完成了。

Edit1:删除了一个不必要的步骤。

于 2016-02-20T17:52:02.943 回答