запись результата вложенного цикла в векторный объект в R - PullRequest
2 голосов
/ 19 августа 2010

У меня есть следующие данные, считанные в R как фрейм данных с именем «data_old»:

   yes year month
1  15 2004     5
2   9 2005     6
3  15 2006     3
4  12 2004     5
5  14 2005     1
6  15 2006     7
.   .  ...     .
.   .  ...     .

Я написал небольшой цикл, который просматривает данные и суммирует переменную yes для каждого месяца /годовая комбинация:

year_f <- c(2004:2006)
month_f <- c(1:12)

for (i in year_f){
    for (j in month_f){
        x <- subset(data_old, month == j & year == i, select="yes")
        if (nrow(x) > 0){
            print(sum(x))
            }
        else{print("Nothing")}
        }
    }

У меня такой вопрос: я могу напечатать сумму для каждой комбинации месяц / год в терминале, но как мне сохранить ее в векторе?(вложенный цикл вызывает у меня головную боль, пытаясь понять это).

Томас

Ответы [ 3 ]

7 голосов
/ 19 августа 2010

Другой способ,

library(plyr)
ddply(data_old,.(year,month),function(x) sum(x[1]))

  year month V1
1 2004     5 27
2 2005     1 14
3 2005     6  9
4 2006     3 15
5 2006     7 15
6 голосов
/ 19 августа 2010

Забудьте о циклах, вы хотите использовать функцию агрегирования. Их недавно обсуждали в этом вопросе .

with(data_old, tapply(yes, list(year, month), sum))

- одно из многих решений.

Кроме того, вам не нужно использовать c(), когда вы ничего не объединяете. Обычная 1:12 в порядке.

3 голосов
/ 19 августа 2010

Просто добавьте третий вариант:

aggregate(yes ~ year + month, FUN=sum, data=data_old)
...