正如标题中所说,我有一个如下所示的 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,我相信应该有一两行解决方案。
有谁知道如何实现这一目标?您的时间和知识将不胜感激。提前致谢。
您可以使用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)
这使
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
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |