2016-06-21 2 views
0

Мои вопросы лучше всего описывается на примере:Сводные данные по нескольким группам

данные:

v1 <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p") 
v2 <- c("aa","bb","cc","dd","ee","ff","gg","hh","ii","jj","kk","ll","mm","nn","oo","pp") 
v3 <- c("aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj","kkk","lll","mmm","nnn","ooo","ppp") 
values <- 1:10000 
y <- data.frame(var1=sample(v1,size = 100,replace=T), 
       var2=sample(v2,size=100,replace=T), 
       var3=sample(v3,size=100,replace=T), 
       val1=sample(values,size=100,replace=T), 
       val2=sample(values,size=100,replace=T)) 


head(y) 
    var1 var2 var3 val1 val2 
1 h hh lll 4832 9547 
2 h nn eee 727 6382 
3 h bb jjj 9985 8041 
4 e bb jjj 1438 280 
5 k ff nnn 3094 4316 
6 f cc kkk 7426 3588 

В основном нужно подвести знач1 и val2 всеми уникальными комбинациями var1, var2, и var3. Таким образом, ни одна из строк в приведенном выше заявлении head не будет суммирована.

В фактических данных, с которыми я работаю, существуют тысячи различных значений для var1, var2 и var3. Кроме того, существует множество столбцов, которые я хочу группировать. Это будет использоваться в блестящем приложении, где пользователь выбирает любое количество групп, которые он/она хочет объединить. Я пробовал использовать stats::aggregate, но для этого он не кажется достаточно универсальным.

Если вам нужно что-нибудь еще, чтобы помочь ответить на мой вопрос, дайте мне знать.

EDIT: Очень полезные ответы до сих пор и спасибо вам за это, но они не совсем то, что я ищу (по моей вине я не сформулировал вопрос достаточно ясно).

Выпуск автоматизация моего сценария, поэтому он может агрегировать в приведенном выше пример, а также следующее:

head(y) 
    var1 var2 var3 var4 var5 val1 val2 val3 
1 p pp nnn ll aaa 3914 6621 8968 
2 d ii jjj pp aaa 5885 955 7560 
3 j bb ppp aa ccc 7979 5602 4639 
4 e mm ooo mm fff 8746 8612 2212 
5 g ee aaa kk lll 4795 6438 6318 
6 f mm kkk ii ggg 7550 90 1173 

В моем блестящем приложении данные могут так же легко выглядеть, или какой-то другой вариант с любым Число столбцов. Я знаю значения индекса для столбцов переменной и значения, но не их имена. Поэтому я могу использовать значения индекса, но они меняются. Кроме того, я не могу действительно жестко кодировать любые столбцы, поскольку они всегда меняются.

Надеюсь, это поможет!

+3

'aggregate (cbind (val1, val2) ~ var1 + var2 + var3, data = y, sum, na.rm = TRUE)' должно работать. – mtoto

+0

Вы даже можете задать имена столбцов, используя 'cbind (" val1 "= val1," val2 "= val2)' в приведенном выше примере. – lmo

ответ

3
library(data.table) 
y<-data.table(y) 
setkey(y, var1, var2, var3) 

y[,.(sum1 = sum(val1), sum2 = sum(val2)), by = c("var1", "var2", "var3") ] 

var1 var2 var3 sum1 sum2 
a cc ggg 4483 5176 
a gg ccc 1928 1833 
a mm ppp 1550 3930 
a nn kkk 1340 2080 
b dd ccc 8950 158 
b hh bbb 4798 689 
b kk mmm 129 9740 
b pp ccc 8363 1531 
c gg ggg 1662 125 
c gg hhh 4485 3800 
... 

Другой популярный вариант dplyr:

library(dplyr) 

y %>% group_by(var1, var2, var3) %>% 
    summarise(sum1 = sum(val1), sum2 =sum(val2)) 

var1 var2 var3 sum1 sum2 
(fctr) (fctr) (fctr) (int) (int) 
    a  cc ggg 4483 5176 
    a  gg ccc 1928 1833 
    a  mm ppp 1550 3930 
    a  nn kkk 1340 2080 
    b  dd ccc 8950 158 
    b  hh bbb 4798 689 
    b  kk mmm 129 9740 
    b  pp ccc 8363 1531 
    c  gg ggg 1662 125 
    c  gg hhh 4485 3800 

Некоторые говорят, что синтаксис dplyr немного легче для чтения/записи, но я предпочитаю оба метода одинаково. Скорость обычно сопоставима, хотя я считаю, что data.table имеет преимущество для очень больших наборов данных.

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