r语言 - 如何删除时间序列数据中缺少测量值的受试者



我有如下数据:

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在数据中出现的次数,并检查它们是否相等。这应该有效,但我觉得必须有一种快速有效的方法来做到这一点。

使用 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

这是一个替代方案

> 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
你可以

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

最新更新