如何过滤掉一个以自身变化为条件的变量和另一个变量?

How to filter out one variable conditioned on the change in itself and another variable?

我正在尝试从随时间推移跟踪个人的面板数据中的数据输入差异中清除我的年龄变量。许多受访者的年龄从一个观察到另一个观察是跳跃的,因为他们错过了几波然后又回来了,正如我们在下面 ID 1 和 2 的人中看到的那样。但是,ID 3 的人的年龄跳跃了这不等于 s/he 不在面板中的年份。

有人可以指导我如何从我的数据中过滤掉年龄不合理变化的受访者,这些变化不等于他们离开小组的年数,而是其他原因,例如数据输入问题?

id  year    age
1   2005    50
1   2006    51
1   2010    55
2   2002    38
2   2005    41
2   2006    42
3   2006    30
3   2009    38
3   2010    39

structure(list(id = structure(c(1, 1, 1, 2, 2, 2, 3, 3, 3), format.stata = "%9.0g"), 
    year = structure(c(2005, 2006, 2010, 2002, 2005, 2006, 2006, 
    2009, 2010), format.stata = "%9.0g"), age = structure(c(50, 
    51, 55, 38, 41, 42, 30, 38, 39), format.stata = "%9.0g")), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))

您可以过滤掉 yearage 中变化不同步的 id

library(dplyr)

df %>%
  group_by(id) %>%
  filter(!all(year - min(year) == age - min(age))) -> unreasonable_data

unreasonable_data

#     id  year   age
#  <dbl> <dbl> <dbl>
#1     3  2006    30
#2     3  2009    38
#3     3  2010    39

同样的逻辑也可以用lag实现。

df %>%
  group_by(id) %>%
  filter(!all(year - lag(year) == age - lag(age))) -> unreasonable_data

我们可以使用diff

library(dplyr)
df %>%
    group_by(id) %>% 
    filter(!all(diff(year) == diff(age)))

-输出

# A tibble: 3 x 3
# Groups:   id [1]
#     id  year   age
#  <dbl> <dbl> <dbl>
#1     3  2006    30
#2     3  2009    38
#3     3  2010    39