我的数据格式与此相似:
ID Timestamp Status
1 1/1/2014 1
2 1/1/2014 1
3 1/2/2014 1
4 1/3/2014 1
1 1/3/2014 2
3 1/3/2014 2
4 1/5/2014 2
5 1/5/2014 1
1 1/6/2014 3
2 1/7/2014 3
3 1/8/2014 3
4 1/9/2014 3
5 1/10/2014 2
6 1/10/2014 1
3 1/10/2014 4
3 1/10/2014 5
3 1/10/2014 6
1 1/11/2014 4
2 1/11/2014 3
3 1/11/2014 4
3 1/11/2014 2
5 1/11/2014 3
6 1/12/2014 4
7 1/12/2014 5
5 1/12/2014 6
4 1/12/2014 7
2 1/13/2014 3
3 1/13/2014 4
1 1/14/2014 5
5 1/14/2014 3
6 1/14/2014 4
1 1/15/2014 6
1 1/16/2014 7
每个ID必须按照1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
然而,由于数据输入错误,有时4发生在3之前,6发生在2之前,7发生在1之前。
那么R可以帮助识别状态变化不是规则的ID吗?
对于上述示例数据 - 只有ID 1 具有正确的状态历史记录1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
- 其他人的记录正确无误。
非常感谢!
答案 0 :(得分:1)
假设ID可以跳过并复制状态(只是永远不会倒退)你可以做这样的事情。这是我用来测试的data.frame
dd<-structure(list(ID = c(1L, 2L, 3L, 4L, 1L, 3L, 4L, 5L, 1L, 2L,
3L, 4L, 5L, 6L, 3L, 3L, 3L, 1L, 2L, 3L, 3L, 5L, 6L, 7L, 5L, 4L,
2L, 3L, 1L, 5L, 6L, 1L, 1L), Timestamp = structure(c(18262, 18262,
18263, 18264, 18264, 18264, 18266, 18266, 18267, 18268, 18269,
18270, 18271, 18271, 18271, 18271, 18271, 18272, 18272, 18272,
18272, 18272, 18273, 18273, 18273, 18273, 18274, 18274, 18275,
18275, 18275, 18276, 18277), class = "Date"), Status = c(1L,
1L, 1L, 1L, 2L, 2L, 2L, 1L, 3L, 3L, 3L, 3L, 2L, 1L, 4L, 5L, 6L,
4L, 3L, 4L, 2L, 3L, 4L, 5L, 6L, 7L, 3L, 4L, 5L, 3L, 4L, 6L, 7L
)), .Names = c("ID", "Timestamp", "Status"), row.names = c(NA,
-33L), class = "data.frame")
然后我定义了一个辅助函数来测试状态值的所有差异都是1并且我们有七个
isgoodseq<-function(x) {
length(x) ==7 & all(diff(x)==1) & min(x)==1
}
现在我们为每个ID运行它(确保数据的顺序正确)
with(dd[order(dd$Timestamp, dd$ID, dd$Status),],
tapply(Status, ID, isgoodseq))
这给了我们
1 2 3 4 5 6 7
TRUE FALSE FALSE FALSE FALSE FALSE FALSE
这意味着1是唯一的好ID