我有以下数据:
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
变量ID
的最大值和最小值。然后我取每个玩家的最大值和最小值之间的差值并添加1.然后我计算每个唯一ID
出现在数据中的次数,并检查它们是否相等。这应该有效,但我觉得必须有一个快速,有效的方法来做到这一点。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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