去除纵向数据中不连续的时间点
Remove discontinuous time points in longitudinal data
我有一个公司年份的纵向数据,但有些公司的年份不是连续的,例如
library(data.table)
dt = data.table(firm_id=c(rep(1,5),rep(2,5)),year=c(1990,1991,1999,2000,2001,1995,1997,2008,2009,2010))
对于每家公司,我想保留最近连续几年的观察结果并删除其他观察结果。例如,公司 1 在 (1990, 1991, 1999, 2000, 2001) 有五年的观察,我想保留 (1999, 2000, 2001)
我能想到一些笨拙的方法来解决这个问题,但我想知道是否有简单的方法来解决它。
看了评论,我也想知道有没有什么办法可以保留最长的连续向量块年。例如,
library(data.table)
dt = data.table(firm_id=c(rep(1,5),rep(2,5)),year=c(1990,1991,1992,2000,2001,1995,1997,2008,2009,2010))
结果会是
library(data.table)
DT2 <- setorder(dt, firm_id, year)[
,d := cumsum(c(TRUE, diff(year) > 1)), by = .(firm_id) ][
,n := .N, by = .(firm_id, d) ]
DT2
# firm_id year d n
# <num> <num> <int> <int>
# 1: 1 1990 1 3
# 2: 1 1991 1 3
# 3: 1 1992 1 3
# 4: 1 2000 2 2
# 5: 1 2001 2 2
# 6: 2 1995 1 1
# 7: 2 1997 2 1
# 8: 2 2008 3 3
# 9: 2 2009 3 3
# 10: 2 2010 3 3
从这里开始,如果您想要 运行 连续 3 年或更长时间,那么
DT2[ (n > 2), ]
如果你想要每个firm_id
最长的运行,那么
DT2[, .SD[n == max(n),], by = .(firm_id) ]
我有一个公司年份的纵向数据,但有些公司的年份不是连续的,例如
library(data.table)
dt = data.table(firm_id=c(rep(1,5),rep(2,5)),year=c(1990,1991,1999,2000,2001,1995,1997,2008,2009,2010))
对于每家公司,我想保留最近连续几年的观察结果并删除其他观察结果。例如,公司 1 在 (1990, 1991, 1999, 2000, 2001) 有五年的观察,我想保留 (1999, 2000, 2001)
我能想到一些笨拙的方法来解决这个问题,但我想知道是否有简单的方法来解决它。
看了评论,我也想知道有没有什么办法可以保留最长的连续向量块年。例如,
library(data.table)
dt = data.table(firm_id=c(rep(1,5),rep(2,5)),year=c(1990,1991,1992,2000,2001,1995,1997,2008,2009,2010))
结果会是
library(data.table)
DT2 <- setorder(dt, firm_id, year)[
,d := cumsum(c(TRUE, diff(year) > 1)), by = .(firm_id) ][
,n := .N, by = .(firm_id, d) ]
DT2
# firm_id year d n
# <num> <num> <int> <int>
# 1: 1 1990 1 3
# 2: 1 1991 1 3
# 3: 1 1992 1 3
# 4: 1 2000 2 2
# 5: 1 2001 2 2
# 6: 2 1995 1 1
# 7: 2 1997 2 1
# 8: 2 2008 3 3
# 9: 2 2009 3 3
# 10: 2 2010 3 3
从这里开始,如果您想要 运行 连续 3 年或更长时间,那么
DT2[ (n > 2), ]
如果你想要每个firm_id
最长的运行,那么
DT2[, .SD[n == max(n),], by = .(firm_id) ]