Расчет темпов роста путем применения логарифмических различий - PullRequest
1 голос
/ 16 апреля 2010

Я пытаюсь преобразовать мой data.frame путем вычисления log-differences каждого столбца и управление для строк id. Так что в основном мне нравится рассчитывать темпы роста для каждой переменной 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 -траусами. Я не хочу свернуть фрейм и уменьшить его, что будет автоматически сделано функцией diff(). Таким образом, у меня было 10 строк в моем исходном кадре, и я сохраняю такое же количество строк после преобразования. Чтобы сохранить одинаковую длину, мне пришлось добавить NAs. Я пошел в обход, преобразовав data.frame в список, добавив NAs к первой строке каждого идентификатора, а затем преобразовал список обратно в data.frame. Это выглядит утомительно.

Есть идеи, как избежать преобразования класса data.frame-list-data.frame и оптимизировать функцию?

1 Ответ

2 голосов
/ 16 апреля 2010

Как насчет этого?

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