【问题标题】:Remove discontinuous time points in longitudinal data删除纵向数据中的不连续时间点
【发布时间】:2021-04-30 21:54:58
【问题描述】:

我有一个公司年度纵向数据,但对于某些公司来说,年份不是连续的,例如

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) 有 5 年的观察值,我想保留 (1999, 2000, 2001)

我可以想到一些尴尬的方法来解决这个问题,但我想知道是否有一种简单的方法来解决它。

在cmets的启发下,我也想知道有没有什么办法可以保持最长的年连续向量块。例如,

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))

结果是

【问题讨论】:

  • 会发生什么 1) 如果您有 1990、1991、1992、2000、2001 年的数据。您还保留 2000 年和 2001 年的数据吗? 2) 如果您有 1990、1991、1993、1994、1995、2000 年的数据。您保留哪些值?
  • 好问题。 1)我正在考虑保留一年中最长的连续块或最近的连续块。 2)在这种情况下,保留任何年份似乎都没有意义,但我宁愿保留2000年的数据

标签: r data.table panel-data longitudinal


【解决方案1】:
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) ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多