【问题标题】:How to remove subjects who have missing measurements in time series data?如何删除时间序列数据中缺少测量值的主题?
【发布时间】:2013-11-02 09:02:44
【问题描述】:

我有如下数据:

ID Year Measurement
1  2009 5.6
1  2010 6.2
1  2011 4.5
2  2008 6.4
2  2009 5.2
3  2008 3.5
3  2010 5.6 
4  2009 5.9
4  2010 2.2
4  2011 4.1
4  2012 5.5

在几年内测量不同的开始和结束年份的科目。受试者也被测量了不同的次数。我想删除在开始和结束测量年份之间没有每年测量的主题。因此,在上述数据中,我希望删除主题 3,因为他们错过了 2009 年的测量。

我想过做一个 for 循环,在其中我为每个唯一的 ID 获取变量 Year 的最大值和最小值。然后,我将每个玩家的最大值和最小值之差加 1。然后我计算每个唯一 ID 在数据中出现的次数,并检查它们是否相等。这应该可行,但我觉得必须有一种快速且更有效的方法来做到这一点。

【问题讨论】:

    标签: r time-series data-cleaning


    【解决方案1】:

    使用data.table 包最简单:

    dt = data.table(df, key="Year")
    dt[,Remove:=any(diff(Year) > 1),by=ID]
    dt = dt[(!Remove)]
    dt$Remove = NULL
    
       ID Year Measurement
    1:  1 2009         5.6
    2:  1 2010         6.2
    3:  1 2011         4.5
    4:  2 2008         6.4
    5:  2 2009         5.2
    6:  4 2009         5.9
    7:  4 2010         2.2
    8:  4 2011         4.1
    9:  4 2012         5.5
    

    【讨论】:

      【解决方案2】:

      这是另一种选择

      > ind <- aggregate(Year~ID, FUN=function(x) x[2]-x[1], data=df)$Year>1
      > df[!df$ID==unique(df$ID)[ind], ]
         ID Year Measurement
      1   1 2009         5.6
      2   1 2010         6.2
      3   1 2011         4.5
      4   2 2008         6.4
      5   2 2009         5.2
      8   4 2009         5.9
      9   4 2010         2.2
      10  4 2011         4.1
      11  4 2012         5.5
      

      【讨论】:

        【解决方案3】:

        你可以试试ave。我的匿名函数基本上是问题中建议的伪代码。

        df[as.logical(ave(df$Year, df$ID, FUN = function(x) length(x) > max(x) - min(x))), ]
        
        #    ID Year Measurement
        # 1   1 2009         5.6
        # 2   1 2010         6.2
        # 3   1 2011         4.5
        # 4   2 2008         6.4
        # 5   2 2009         5.2
        # 8   4 2009         5.9
        # 9   4 2010         2.2
        # 10  4 2011         4.1
        # 11  4 2012         5.5
        

        【讨论】:

        • 谢谢@Jilber!套用 Jay-Z 的话说:得'ave it!
        猜你喜欢
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 2022-10-06
        • 1970-01-01
        • 2016-07-28
        相关资源
        最近更新 更多