2012-07-27 41 views
12

mam następujące próbki data.table:agregujące wiele kolumn w data.table

dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10)) 

Chciałbym agregować wszystkie kolumny (A i B, jednak powinny one być przechowywane oddzielnie) przez id używając colSums, na przykład . Jaki jest prawidłowy sposób to zrobić? Poniższa nie działa:

dtb[,colSums, by="id"] 

To jest tylko przykładowy i moja tabela ma wiele kolumn, więc chcę uniknąć, określając wszystkie z nich w nazwie funkcji

Odpowiedz

24

to jest rzeczywiście to, co szukałem i jest wymienione w FAQ:

dtb[,lapply(.SD,mean),by="id"] 
+3

+1 Te, masz całkowitą rację, to zdecydowanie lepszy sposób. Zawsze uważam, że powinienem mieć wszystko w długim formacie, ale dość często, jak w tym przypadku, wykonywanie obliczeń jest bardziej wydajne. Powinieneś oznaczyć swoją jako poprawną odpowiedź. –

+0

OK brzmi dobrze, zmienię to na poprawną odpowiedź. – Alex

+0

+1 Btw, ta składnia została zoptymalizowana w najnowszym v1.8.2. Była kara za używanie "lapply" w 'j', ale już nie. Dokonano zmian w punktach wiki "data.table" 1, a do punktu 5 są potrzebne. –

0

Chyba w tym przypadku jest to najszybciej wprowadzają swoje dane najpierw w długim formacie i wykonać agregację obok (patrz komentarze Mateusza w tym SO post):

library(data.table) 
dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10)) 
library(reshape2) 
dt_long <- as.data.table(melt(dtb, id.var="id")) 
dt_long[, sum(value), by=c("id","variable")] 
    id variable V1 
1: 1  a 601 
2: 2  a 440 
3: 3  a 496 
4: 4  a 553 
5: 5  a 444 
6: 6  a 466 
7: 7  a 525 
8: 8  a 553 
9: 9  a 541 
... 
+0

wydaje się to dość nieefektywne .. czy nie ma możliwości wybrania identyfikatora raz zamiast jednego raz na zmienną? – Alex

+0

Jestem zdezorientowany ... Co rozumiesz przez nieefektywność? Jest zbyt dużo kodu do napisania lub jest zbyt wolny? I co to znaczy po prostu wybrać identyfikator raz zamiast raz na zmienną? Czy nie chcesz sumy dla każdej kombinacji zmiennej i id? –

+0

tak, to prawda. Nieefektywne mam na myśli to, ile wyszukiwań przez ramkę danych musi wykonać kod. chyba że nie rozumiem podstaw, w jaki sposób R robi rzeczy, z operacją wektorową, id musi być sprawdzony raz, a następnie suma w kolumnach jest wykonywana jako operacja wektorowa. w sposób, w jaki proponujesz, (id, zmienna) musi być podnoszona za każdym razem. w moim stole mam około 200 kolumn, więc to coś zmieni. Nie? – Alex

Powiązane problemy