2010-04-16 32 views
1

我試圖通過計算每列 的log-differences並控制行id來轉換我的data.frame。所以基本上我喜歡計算每個ID的變量的增長率。 所以這裏是一個隨機DF與id列,時間段科拉姆p和三個可變列:通過應用對數差異計算增長率

df <- data.frame (id = c("a","a","a","c","c","d","d","d","d","d"), 
        p = c(1,2,3,1,2,1,2,3,4,5), 
        var1 = rnorm(10, 5), 
        var2 = rnorm(10, 5), 
        var3 = rnorm(10, 5) 
       ) 
df 
    id p  var1  var2  var3 
1  a 1 5.375797 4.110324 5.773473 
2  a 2 4.574700 6.541862 6.116153 
3  a 3 3.029428 4.931924 5.631847 
4  c 1 5.375855 4.181034 5.756510 
5  c 2 5.067131 6.053009 6.746442 
6  d 1 3.846438 4.515268 6.920389 
7  d 2 4.910792 5.525340 4.625942 
8  d 3 6.410238 5.138040 7.404533 
9  d 4 4.637469 3.522542 3.661668 
10 d 5 5.519138 4.599829 5.566892 

現在我已經寫了這不正是我想要的功能,但我不得不繞道而行這是可能是不必要的,可以刪除。但是,不知何故,我無法找到 的快捷方式。 下面是函數和輸出爲發佈數據幀:

fct.logDiff <- function (df) { 
df.log <- dlply (df, "code", function(x) data.frame (p = x$p, log(x[, -c(1,2)]))) 
list.nalog <- llply (df.log, function(x) data.frame (p = x$p, rbind(NA, sapply(x[,-1], diff)))) 
ldply (list.nalog, data.frame) 
} 

fct.logDiff(df) 
    id p  var1  var2  var3 
1  a 1   NA   NA   NA 
2  a 2 -0.16136569 0.46472004 0.05765945 
3  a 3 -0.41216720 -0.28249264 -0.08249587 
4  c 1   NA   NA   NA 
5  c 2 -0.05914281 0.36999681 0.15868378 
6  d 1   NA   NA   NA 
7  d 2 0.24428771 0.20188025 -0.40279188 
8  d 3 0.26646102 -0.07267311 0.47041227 
9  d 4 -0.32372771 -0.37748866 -0.70417351 
10 d 5 0.17405309 0.26683625 0.41891802 

麻煩的是,由於加入NA -rows。我不想摺疊框架並將其縮小,這將通過diff()函數自動完成。所以我在原始幀中有10行,並在轉換後保持相同數量的行。爲了保持相同的長度,我不得不添加一些NAs。我已經通過將data.frame轉換成列表繞道了,將NAs添加到每個id的第一行,然後將列表轉換回data.frame。那看起來很乏味。

任何想法,以避免data.frame-list-data.frame類轉換和優化功能?

回答

2

這個怎麼樣?

nadiff <- function(x, ...) c(NA, diff(x, ...)) 
ddply(df, "code", colwise(nadiff, c("var1", "var2", "var3"))) 
+0

@hadley很好,工作正常!我總是試圖將其中一個應用函數與一個基本包函數結合起來。我只需要再看看你的plyr包裝。我以前沒有使用過colwise功能。謝謝! – mropa 2010-04-16 16:46:20