2013-10-23 64 views
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循環,其中我得到了每個唯一ID的變量Year的最大值和最小值。然後我將每個玩家的最大值和最小值之間的差值加1,然後計算每個唯一的ID在數據中出現的次數,並檢查它們是否相等。這應該工作,但我覺得有一個快速,更有效的方法來做到這一點。

回答

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

這裏有一個替代

> 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 
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 
+0

+1不錯的使用'ave';) –

+2

Thanks @Jilber!釋義傑伊 - Z:得到''大道呢! – Henrik

相關問題