检查时间序列不一致

时间:2017-12-09 00:06:09

标签: r dataframe time-series aggregate

让我们说我们有以下矩阵:

x<- as.data.frame(cbind(c("A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D"),
                        c(1,2,3,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
                        c(14,28,42,14,46,64,71,85,14,28,51,84,66,22,38,32,40,42)))
colnames(x)<- c("ID","Visit", "Age")

第一列代表主题ID,第二列代表观察列表,第三列代表每个连续观察的年龄。

根据之前的访问年龄,这是查找年龄错误的访问的最简单方法。 (即在第13行,主题C是66岁,在上次访问时他已经是84或第16行,主题D是32岁,在上次访问时他已经是38岁。)

哪种方法可以突出显示潜在错误并删除第13行和第16行?

我尝试按ID进行汇总,并查看不同访问次数之间的差异,但对我来说似乎很难,因为任何访问都可能发生错误。

3 个答案:

答案 0 :(得分:1)

您可以通过过滤掉每个diff(Age) ID为负的行来实现。 使用dplyr包:

library(dplyr)

x %>% group_by(ID) %>%  filter(c(0,diff(Age))>=0)
# A tibble: 16 x 3
# Groups:   ID [4]
       ID  Visit    Age
   <fctr> <fctr> <fctr>
 1      A      1     14
 2      A      2     28
 3      A      3     42
 4      B      1     14
 5      B      2     46
 6      B      3     64
 7      B      4     71
 8      B      5     85
 9      C      1     14
10      C      2     28
11      C      3     51
12      C      4     84
13      D      1     22
14      D      2     38
15      D      4     40
16      D      5     42

答案 1 :(得分:1)

基地R如何?

df <- do.call(rbind.data.frame, lapply(split(x, x$ID), function(w) 
    w[c(1, which(diff(w[order(w$Visit), "Age"]) > 0) + 1), ]));
df;
#    ID Visit Age
#A.1   A     1  14
#A.2   A     2  28
#A.3   A     3  42
#B.4   B     1  14
#B.5   B     2  46
#B.6   B     3  64
#B.7   B     4  71
#B.8   B     5  85
#C.9   C     1  14
#C.10  C     2  28
#C.11  C     3  51
#C.12  C     4  84
#D.14  D     1  22
#D.15  D     2  38
#D.17  D     4  40
#D.18  D     5  42    

说明:我们在列dataframe上拆分ID,然后按dataframe对每个Visit子集进行排序,计算连续Age值之间的差异,并且仅保持差异所在的那些行> 0(即Age正在增加); rbind给出最终dataframe

答案 2 :(得分:1)

aggregate()方法非常简洁 删除坏行

good <- do.call(c, aggregate(Age ~ ID, x, function(z) c(z[1], diff(z)) > 0)$Age)

x[good,]
#    ID Visit Age
# 1   A     1  14
# 2   A     2  28
# 3   A     3  42
# 4   B     1  14
# 5   B     2  46
# 6   B     3  64
# 7   B     4  71
# 8   B     5  85
# 9   C     1  14
# 10  C     2  28
# 11  C     3  51
# 12  C     4  84
# 14  D     1  22
# 15  D     2  38
# 17  D     4  40
# 18  D     5  42

这只会突出显示哪些群体存在不一致:

aggregate(Age ~ ID, x, function(z) all(diff(z) > 0))
#   ID   Age
# 1  A  TRUE
# 2  B  TRUE
# 3  C FALSE
# 4  D FALSE