R - 转换DataFrame

时间:2016-08-21 13:59:45

标签: r dataframe reshape

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

问题1:我发现"天"确实是$ 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:我需要过滤标记为&#34;已完成&#34;在$状态。在这里,只有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

1 个答案:

答案 0 :(得分:1)

您希望将函数应用于按因子划分的数据框(在您的情况下为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)
)