2015-11-28 20 views
2

Мои данные выглядят следующим образом:R: агрегат dataframe, но другой столбец

browsers.id browsers.label browsers.count browsers.id.1 browsers.label.1 browsers.count.1 
OS;FBSV  OS;FBSV   6  Chrome   Chrome    3 
Chrome   Chrome    86  Safari   Safari    47 
Chrome   Chrome    21  OS;FBSV   OS;FBSV    14 

Я хочу объединить или объединить данные для:

browsers.id count 
Chrome  110 
OS;FBSV  20 
Safari  47 

Я пытаюсь использовать агрегатную функцию,

aggregate(data[ ,3], list(data$browser.id), sum) 

Но возникает ошибка:

"arguments must have same length" 

Мог ли я исправить это? Благодарю.

ответ

1

Мы подмножаем столбцы «id» и «count», преобразуем «data.frame» в «data.table» (setDT(..), переформатируем «широкий» формат на «длинный», используя melt (данные. таблица melt может принимать несколько столбцов measure), сгруппированные по 'browsers.id', мы получаем sum 'count'.

library(data.table) 
melt(setDT(df1[c(1,3,4,6)]), measure=patterns('id', 'count'), 
    value.name=c('browsers.id','count'))[,list(count=sum(count)) , 
     by = browsers.id] 
# browsers.id count 
#1:  OS;FBSV 20 
#2:  Chrome 110 
#3:  Safari 47 

Или другой вариант будет rbind 'ид', 'количество' столбцов

rbindlist(list(df1[c(1,3)], df1[c(4,6)]))[, 
      list(count= sum(browsers.count)) ,browsers.id] 
+1

Спасибо! Поскольку у меня есть более шести столбцов, я пытаюсь «setDT (df1)», и это работает :) –