数据格式如下:
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
-其他都注意正确。
非常感谢!
假设ID可以跳过和复制状态(只是永远不会后退),您可以这样做。这是我用来测试
的data。framedd<-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并且我们有7个
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