2016-11-30 3 views
-1

Я пытаюсь использовать для цикла в агрегированной функции, мне не удалось назначить X1, X2, в функции агрегата через цикл. Я создал фиктивный пример и есть мой код слишкомLooping через функцию агрегата в R

year = cbind(rep(2000, 12), rep(2001, 12), rep(2002, 12)) 
year = as.vector(as.matrix(year)) 
month = cbind(seq(1:12), seq(1:12), seq(1:12)) 
month = as.vector(as.matrix(month)) 
X1 = rnorm(36, mean = 0, sd = 1) 
X2 = rnorm(36, mean = 2, sd = 1) 
X3 = rnorm(36, mean = 0, sd = 1) 
DF = data.frame(cbind(year, month, X1, X2, X3)) 

for (i in 1:3) { 
    bb_month = aggregate(as.symbol(sprintf('X%1.0f', i)) ~ month + year, DF , sum) 
} 
+0

Что именно вы пытаетесь сделать? Вы хотите суммировать по месяцам + год, когда у вас есть только уникальные комбинации этих факторов. –

+0

У меня есть ежедневные данные, пример должен был просто показать, работает ли цикл таким образом –

ответ

1

Если я правильно понял, то это следует сделать трюк:

year <- rep(c(2000:2002), each = 12) 
month <- rep(1:12, 3) 
days <- rep("it's a day!", length(year)) #dummy var 

X1 <- rnorm(36, mean = 0, sd = 1) 
X2 <- rnorm(36, mean = 2, sd = 1) 
X3 <- rnorm(36, mean = 0, sd = 1) 

DF <- data.frame(year, month, days, X1, X2, X3) 

aggregate(formula = . ~ year + month, 
      data = DF[, names(DF) != "days"], 
      FUN = sum) 

EDIT: Если вы сделаете аналогичный расчет для X1-X3 , вероятно, лучший способ, кроме цикла. Но если вы настаиваете на выполнении этого цикла:

for (i in 1:3) { 
    fml <- as.formula(sprintf('X%i ~ month + year', i)) 
    bb_month <- aggregate(formula = fml, 
         data = DF, FUN = sum) 
    ###Loop continues### 
} 
+0

Да, это работает, но я хочу, чтобы это произошло в цикле, так как я делаю другие вычисления дальше. все, что я хочу, - это изменить X1 в агрегированной функции на X2, X3 ... и так далее, как прогресс цикла –