R - 转换数据框

R - Transforming DataFrame

我在下面创建了一个数据结构示例。

问题一:我发现"days"确实是$start和$end的差值,但并不能反映实际测量的天数。所以对于 $id 中的每个 id,我都需要一个计数器。因此,id=2 的值应该是“2”天而不是“4”。

解决方法:

Count <- rle(sort(activity$id))
activity$count <- Count[[1]][match(activity$id, Count[[2]])]

问题 2:之后,必须删除所有没有恰好 4 天测量的测量。在这种情况下,id 1、3、5 和 6 将存活下来,因为 id 2 和 4 将分别只有 2 和 3 个数据点。

解决方法:

activity <- subset(activity, count== 30)

问题 3:我需要过滤 $status 中标记为 "finished" 的案例。在这里,经过所有调整后,只有 id 1,3 和 6 可以存活。

R 中的每一步看起来如何?

id  status   energy sun start       end         days
1   ok       10     10  01/05/16    01/09/16    4
1   ok       20     20  01/05/16    01/09/16    4
1   ok       30     30  01/05/16    01/09/16    4
1   finished 40     40  01/05/16    01/09/16    4
2   ok       0      5   12/06/15    12/10/15    4
2   failed   0      5   12/06/15    12/10/15    4
3   ok       10     5   12/26/15    12/30/15    4
3   ok       20     10  12/26/15    12/30/15    4
3   ok       30     15  12/26/15    12/30/15    4
3   finished 40     20  12/26/15    12/30/15    4
4   ok       10     0   07/09/15    07/12/15    3
4   ok       15     10  07/09/15    07/12/15    3
4   failed   5      10  07/09/15    07/12/15    3
5   ok       10     5   11/16/15    11/20/15    4
5   ok       12     10  11/16/15    11/20/15    4
5   ok       18     15  11/16/15    11/20/15    4
5   failed   20     20  11/16/15    11/20/15    4
6   ok       10     20  12/31/15    01/04/16    4
6   ok       20     30  12/31/15    01/04/16    4
6   ok       30     35  12/31/15    01/04/16    4
6   finished 40     45  12/31/15    01/04/16    4

您希望将函数应用于按因子拆分的数据框(在您的情况下,id)。在 base R 中,您需要 by() 及其相关函数 tapply()。假设d是你的数据:

d$days <- tapply(d$id, d$id, length)[d$id]
d <- subset(d, days == 4)
d <- do.call(rbind,
  by(d, d$id, function(x) if ("finished" %in% x$status) x else NULL)
)