2012-02-29 66 views
4

我相信ddply ist我需要爲我的任務的工具,我有點難以得到正確的結果。我已經閱讀了ddply幾個小時,並嘗試過使用不同的代碼,但我自己並沒有進一步的瞭解。 這裏是一個例子的數據幀ddply滯後與多個子集

station <- c(rep("muc",13), rep("nbw", 17)) 
year <- c(rep(1994,4),rep(1995,4),rep(1996,5),rep(1994,5), rep(1995,4), rep(1996,4), rep(1997, 4)) 
depth <- c(rep(c("HUM","31-60","61-90","91-220"),2), rep(c("HUM","0-30", "31-60","61-90","91-220"),2),rep(c("HUM","0-30", "31-60","91-220"),1),rep(c("HUM","0-30", "31-60","61-90"),2)) 
doc <- c(80, 10, 3, 2,70, 15, 5, 5,70, 20, 5, 5, 2, 40, 10, 3, 2, 1,50, 15, 5, 2, 45, 20, 2, 1,35, 8, 2, 1) 

df <-data.frame(station,year,depth,doc) 
df 

深度是指土壤深度(HUM =腐殖質層)和DOC是用於土壤深度測量的溶解的有機碳(DOC)。請注意,並非每年都有文檔測量,並且缺少一些深度類別。這很煩人,但經常在我的數據集中出現。 隨着ddply,我想添加一個列到這個數據框,這樣,對於每個深度,上述躺在土壤層的文檔返回和HUM NA應該給出,因爲沒有什麼是在腐殖質層頂部。 爲例:

depth doc doc_m1 
HUM  80 NA 
31-60 10 80 
61-90 3 10 
91-220 2 3 

在數據幀這當然應計算爲每年每深度。我想避免哪些和循環,看起來ddply適合這個,但是我沒有任何運氣得到延遲命令來使用ddply。 這是據我的代碼(顯然不是很遠)有:

doc <- ddply(df, .(year), transform, 
     doc_m1 = ????) 

有沒有人有一個建議? 在此先感謝!

回答

5

如果你的深度已經在你的數據集的正確順序(因爲它們是在你的例子),你可以只是做:

doc2 <- ddply(df, .(station, year), transform, 
     doc_m1 = c(NA, doc[-length(doc)])) 

注意我亦自站。這給出:

> head(doc2, 10) 
    station year depth doc doc_m1 
1  muc 1994 HUM 80  NA 
2  muc 1994 31-60 10  80 
3  muc 1994 61-90 3  10 
4  muc 1994 91-220 2  3 
5  muc 1995 HUM 70  NA 
6  muc 1995 31-60 15  70 
7  muc 1995 61-90 5  15 
8  muc 1995 91-220 5  5 
9  muc 1996 HUM 70  NA 
10  muc 1996 0-30 20  70 

如果它們尚未按深度排序,請按照正確的順序對深度進行排序,然後對其進行排序。那麼這種方法應該工作。

+0

非常感謝,這工作完美!我對R的瞭解越多,我越發現正確的解決方案通常是最簡單的解決方案,它只是找出那些棘手問題的簡單解決方案。 – 2012-03-01 06:34:01