1

我有如下数据:

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 循环,在其中我得到Year每个 unique的变量的最大值和最小值ID。然后,我将每个玩家的最大值和最小值之差加 1。然后我计算每个唯一ID身份出现在数据中的次数,并检查它们是否相等。这应该可行,但我觉得必须有一种快速、更有效的方法来做到这一点。

4

3 回答 3

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
于 2013-10-23T21:36:39.070 回答
1

这是一个替代方案

> 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
于 2013-10-23T21:39:43.277 回答
1

你可以试试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
于 2013-10-23T21:49:47.627 回答