применяя скользящее среднее по группе в R - PullRequest
10 голосов
/ 10 марта 2012

Я новичок в R, и у меня много проблем с выполнением чего-то, что, вероятно, очень просто. У меня большой набор данных, разбитый на группы по коду страны, и я хочу взять скользящее среднее значение индекса цен за 3 месяца по странам, а затем поместить его в новый столбец, соответствующий соответствующему месяцу. Я пытался использовать Rollmean, как это безуспешно (код и сообщения об ошибках ниже):

> leader$last3<-tapply(leader, leader$ccode, 
    function(x) rollmean(leader$GI_delta, 3, na.pad=T))
Error in tapply(leader, leader$ccode, function(x) rollmean(leader$GI_delta,  : 
  arguments must have same length

> leader$last3<-ddply(leader, .(ccode), 
    rollmean(GI_delta, 3, na.pad=T))

Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress,  : 
  .fun is not a function.

Любая помощь будет высоко ценится!

Ответы [ 2 ]

13 голосов
/ 10 марта 2012

Если вы хотите создать новый столбец, попробуйте использовать ave. Он похож на tapply, но возвращает вектор такой же длины, что и его первый аргумент. Мой опыт показывает, что это намного быстрее, чем ddply:

require(zoo)
leader$last3<-ave(leader$GI_delta, leader$ccode, 
                         FUN= function(x) rollmean(x, k=3, na.pad=T) )
5 голосов
/ 10 марта 2012

В первой попытке ваша функция не использует аргумент x и всегда возвращает одно и то же (вектор с неправильным размером).Кроме того, первым аргументом должен быть вектор.Наконец, tapply возвращает список векторов: вы не можете поместить результат непосредственно в data.frame.

library(zoo)
n <- 10
leader <- data.frame(
  ccode = rep(LETTERS[1:3],each=n),
  GI_delta = rnorm(3*n)
)
tapply(
  leader$GI_delta, 
  leader$ccode, 
  function(x) rollmean(x, 3, na.pad=TRUE)
)

Во втором примере третий аргумент plyr должен быть функцией, а невыражение.Если вы хотите использовать выражение, вы можете использовать summarize или transform как функцию (summarize возвращает 1-рядный data.frame для каждого значения ccode, тогда как transform сохраняет количество строкбез изменений) и поместите выражения в качестве дополнительных аргументов.

library(plyr)
ddply(
  leader, "ccode",
  transform,
  last3 = rollmean( GI_delta, 3, align="right", na.pad=TRUE )
)
...