【发布时间】:2016-04-11 00:23:23
【问题描述】:
这是我的示例数据:
df = data.frame(id=rep(c(123,456,789),each=5),day=rep(c(1:5),3),measure=c(2.2,3.4,2.1,-0.2,-1.2,3.4,2.4,-2.2,-3.1,-1.7,3.9,5.4,-1,3.2,4.2))
id day measure
1 123 1 2.2
2 123 2 3.4
3 123 3 2.1
4 123 4 -0.2
5 123 5 -1.2
6 456 1 3.4
7 456 2 2.4
8 456 3 -2.2
9 456 4 -3.1
10 456 5 -1.7
11 789 1 3.9
12 789 2 5.4
13 789 3 -1.0
14 789 4 3.2
15 789 5 4.2
每个人都有五天的数据。
我想在 df$measure 中为每个人找到位置,其中每个人中有三个或更多连续的负值,然后删除这些行。如果有两个或更少的连续负值,只需将值设置为 0。
个别123末尾有两个负值,所以把值改成0 个人 456 最后有三个负值,所以删除这些行 个人 789 在第 3 天有一个负值,因此将值更改为 0
结果:
id day measure
1 123 1 2.2
2 123 2 3.4
3 123 3 2.1
4 123 4 0
5 123 5 0
6 456 1 3.4
7 456 2 2.4
8 789 1 3.9
9 789 2 5.4
10 789 3 0
11 789 4 3.2
12 789 5 4.2
到目前为止我所拥有的:
如果我首先将 df$measure 中的所有负值变为 0..
df$measure[df$measure < 0] <- 0
然后以某种方式使用 rle:
m = rle(df$measure)
Run Length Encoding
lengths: int [1:12] 1 1 1 2 1 1 3 1 1 1 ...
values : num [1:12] 2.2 3.4 2.1 0 3.4 2.4 0 3.9 5.4 0 ...
并从 m$lengths 和 m$values 中计算出连续 3 个或更多的 0 的索引 - 需要删除这些索引。
但是需要对每个ID分别进行检查吗?
实现这一目标的最有效方法是什么?
【问题讨论】: