我在下面创建了一个数据结构示例。
问题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
答案 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)
)