2014-02-10 3 views
2

У меня есть data.frame с 3 переменными и 1.425.558 наблюдениями. Это реестр установленной электроэнергии от заводов по производству возобновляемых источников энергии. В каждом ряду стоит одна установленная электростанция. В области zipcode могут быть несколько электростанций одного и того же типа.Как суммировать числовую переменную двумя факторами в R

ID zipcode  Type power 
1 79280 solarpower 3 
2 79280 solarpower 3 
3 79283 hydroelectric 3 
4 79280 biogas   55 
5 79280 windpower 2 
6 21459 windpower 4 
7 21459 windpower 2 

Я хотел бы суммировать по zipcode, сколько солнечной энергии/биогаза/ветроэнергетики установлено.

zipcode  Type power 
21459  windpower 6 
79280  solarpower 6 
79280  windpower 2 
...and so on. 

Я уже пытался

aggregate(myDat$power, by=list(myDat$zipcode,myDat$type), FUN=sum) 

, но моя память не была sufficant.

Я знаю, что мой dataframe очень большой. Я мог бы сузить его много, потому что мне нужны только данные для этих zipcodes, начинающихся с «2».

Не могли бы вы указать мне на решение? Большое спасибо за помощь начинающему!

ответ

4

Если я правильно понимаю, что вам нужно, вы можете выразить его с помощью dplyr:

> data %.% group_by(zipcode, Type) %.% summarise(power = sum(power)) 
Source: local data frame [5 x 3] 
Groups: zipcode 

    zipcode   Type power 
1 21459  windpower  6 
2 79280  windpower  2 
3 79280  biogas 55 
4 79283 hydroelectric  3 
5 79280 solarpower  6 

И если вы хотите только те, почтовый индекс, которые начинаются от 2, вы можете filter первым:

> data %.% filter(grepl("^2", zipcode)) %.% 
    group_by(zipcode, Type) %.% summarise(power = sum(power)) 
Source: local data frame [1 x 3] 
Groups: zipcode 

    zipcode  Type power 
1 21459 windpower  6 
+0

Да! !! Это оно! Спасибо! И для вычисления потребовалось всего две секунды! – SEMson

4

data.table версия:

library(data.table) 
dt = data.table(your_df) 

dt[, sum(power), by = list(zipcode, Type)] 

И т о сужать первых:

dt[grep("^2", zipcode), sum(power), by = list(zipcode, Type)] 

Поскольку grep дорого, как в dplyr и data.table вы, вероятно, лучше (скорость-накрест) подведение итогов первой и второй фильтрации, то есть:

dt[, sum(power), by = list(zipcode, Type)][grep("^2", zipcode)] 
+0

, используя аргумент 'perl = TRUE' для' grep', помогает немного ускорить процесс. – Arun

+3

Кроме того, если вы знаете, что почтовый индекс всегда 5-значный, вы можете сделать: 'zipcode% /% 10000 == 2' (никакое преобразование в символ также не может сэкономить больше времени). – Arun

 Смежные вопросы

  • Нет связанных вопросов^_^