只保留连续观察

Jas*_*oal 2 r dataframe

正如标题中所说,我有一个如下所示的 data.frame,

df<-data.frame('id'=c('1','1','1','1','1','1','1'),'time'=c('1998','2000','2001','2002','2003','2004','2007'))
df
  id time
1  1 1998
2  1 2000
3  1 2001
4  1 2002
5  1 2003
6  1 2004
7  1 2007
Run Code Online (Sandbox Code Playgroud)

还有一些其他情况的时间窗口比这更短或更长,只是为了说明。

我想要做的两件事情有关这组数据,首先,找到所有那些id具有至少这里连续五年的观察,这可以通过下面的方法解决来完成。其次,我想保持只有那些观测中的至少五个连续排id由第一步骤中选择。理想的结果是:

df
  id time
1  1 2000
2  1 2001
3  1 2002
4  1 2003
5  1 2004
Run Code Online (Sandbox Code Playgroud)

我可以使用 for 循环和diff函数编写一个复杂的函数,但是如果我有一个更大的数据集,那么这在编写函数和获取结果方面可能非常耗时,如果id。但这似乎不像 R,我相信应该有一两行解决方案。

有谁知道如何实现这一目标?您的时间和知识将不胜感激。提前致谢。

Sot*_*tos 6

您可以使用dplyrto group byid和连续时间,以及filter少于 5 个条目的组,即

#read data with stringsAsFactors = FALSE
df<-data.frame('id'=c('1','1','1','1','1','1','1'),
               'time'=c('1998','2000','2001','2002','2003','2004','2007'), 
                                                     stringsAsFactors = FALSE)

library(dplyr)

df %>% 
 mutate(time = as.integer(time)) %>% 
 group_by(id, grp = cumsum(c(1, diff(time) != 1))) %>% 
 filter(n() >= 5)
Run Code Online (Sandbox Code Playgroud)

这使

# A tibble: 5 x 3
# Groups:   id, grp [1]
     id  time   grp
  <chr> <int> <dbl>
1     1  2000     2
2     1  2001     2
3     1  2002     2
4     1  2003     2
5     1  2004     2
Run Code Online (Sandbox Code Playgroud)