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