2010-04-16 1 views
1

Я пытаюсь преобразовать свой data.frame, вычисляя log-differences каждого столбца и контролируя строки id. Итак, в основном я хотел бы рассчитать темпы роста для каждой переменной id. Так вот случайная ДФ со столбцом идентификаторов, временный период Колумом р и трех столбцами переменными:Расчет темпов роста путем применения логарифмических разностей

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 к первой строке каждого идентификатора, а затем преобразовываю список обратно в 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 nice, отлично работает! Я всегда пытался объединить одну из функций приложения с одной из функций базового пакета. и мне нужно было еще раз взглянуть на ваш пакет plyr. Я раньше не использовал функцию colwise. благодаря! – mropa