получить сумму одного столбца и среднего другого с группировкой - PullRequest
1 голос
/ 19 июня 2019

У меня есть датафрейм, который выглядит так:

    Year Iteration Production Technology
    2015     1     200        Gas
    2015     1     305        Gas
    2016     1     150        Gas
    2016     1     200        Gas
    2015     2     200        Gas 

В столбце «Технология» указывается тип электростанции. Поэтому для каждого года и каждой итерации в столбце «Технология» может быть несколько заводов.

Я хотел бы объединить данные, чтобы у меня было одно значение для года, среднее значение всех итераций и сумма всех электростанций для этой конкретной технологии.

В этом примере это будет:

    Year Iteration Production Technology 
    2015 1.5       705        Gas
    2016 1.5       350        Gas

Я пробовал различные подходы с функцией агрегирования, но потерпел неудачу из-за того, что она также агрегирует столбец Technology (деление общего производства на количество электростанций).

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

Другой подход в data.table:

library(data.table)

dt1[ , list(Iteration=mean(Iteration), 
            Production=sum(Production)), 
                                        by=list(Year,Technology)]

#>    Year Technology Iteration Production
#> 1: 2015        Gas  1.333333        705
#> 2: 2016        Gas  1.000000        350

Как побочный эффект моей недавней одержимости , это решение с использованием пакета sqldf:

library(sqldf)

sqldf("select Year, Technology, 
       avg(Iteration) as AVG_Iteration, sum(Production) as TOT_Production
       from dt1 
       group by Year, Technology", drv="SQLite")

#>   Year Technology AVG_Iteration TOT_Production
#> 1 2015        Gas      1.333333            705
#> 2 2016        Gas      1.000000            350

Создано в 2019-06-19 пакетом представ (v0.3.0)

Данные:

dt1 <- fread(input = "  Year Iteration Production Technology
                        2015     1     200        Gas
                        2015     1     305        Gas
                        2016     1     150        Gas
                        2016     1     200        Gas
                        2015     2     200        Gas ")
3 голосов
/ 19 июня 2019

Опцией будет tidyverse для группировки по 'Году', 'Технологии', получить mean 'Итерации' и sum 'Производства'

library(tidyverse)
df1 %>% 
     group_by(Year, Technology) %>%
     summarise(Iteration = mean(Iteration),
               Production = sum(Production))
# A tibble: 2 x 4
# Groups:   Year [2]
#   Year Technology Iteration Production
#  <int> <chr>          <dbl>      <int>
#1  2015 Gas             1.33        705
#2  2016 Gas             1           350

данных

df1 <- structure(list(Year = c(2015L, 2015L, 2016L, 2016L, 2015L), Iteration = c(1L, 
1L, 1L, 1L, 2L), Production = c(200L, 305L, 150L, 200L, 200L), 
    Technology = c("Gas", "Gas", "Gas", "Gas", "Gas")), 
    class = "data.frame", row.names = c(NA, 
-5L))
...