Использование для циклов для группировки одной переменной другой переменной и назначения выходных данных вектору

У меня есть фрейм данных с информацией об установках солнечных панелей. Важными переменными являются id, yearBuilt, kw и panels. Упрощенная версия будет выглядеть следующим образом:

id <- c(1, 2, 3, 4, 5)
yearBuilt <- c(2010, 2010, 2011, 2011, 2012)
kw <- c(20, 35, 10, 100, 10)
panels <- c(2, 3, 1, 8, 1)
df1 <- data.frame(id, yearBuilt, kw, panels)

Я хочу создать новый фрейм данных, который имеет сумму kw и панелей по годам.

Чтобы создать этот фрейм данных, я решил создать три вектора (years; sum of kw by year, which i’ll called kwSum; and sum of panels by year, which i’ll called panelsSum), а затем объединить их с данными.рамка. Я создал вектор лет с

years <- sort(unique(df1$yearBuilt))

Чтобы получить вектор kwSum, я попробовал следующее:

kwSum <- c()
for(i in 1:length(years)) {
    kwSum[i] <- 0        
            for(j in 1:nrow(df1)) {
                    if(df1$yearBuilt[j] == i){
                            kwSum[i] <- kwSum[i] + df1$kw[j]
                    }
            }

}

Однако это создает вектор 0. Удаление kwSum[i] Вектор правильной длины, но мой внутренний цикл for, кажется, не работает.

Что я делаю не так?

Я понимаю, что lapply может помочь в этой ситуации, но мне интересно, как я мог бы сделать это с помощью simple for loops, поскольку я все еще пытаюсь прибить основы.

Метки

2 ответа

  1. Просто польза aggregate()сгруппировать переменными и агрегатными столбцами, отсутствие forнеобходимых петель:

    aggdf <- aggregate(. ~ yearBuilt, df1[c("yearBuilt", "kw", "panels")], FUN=sum)
    aggdf
    
    #   yearBuilt  kw panels
    # 1      2010  55      5
    # 2      2011 110      9
    # 3      2012  10      1
    
  2. Мы можем использовать dplyr

    library(dplyr)
    df1 %>% 
         group_by(yearBuilt) %>% 
         summarise_each(funs(sum), kw:panels)
    # A tibble: 3 × 3
    # yearBuilt    kw panels
    #      <dbl> <dbl>  <dbl>
    #1      2010    55      5
    #2      2011   110      9
    #3      2012    10      1