R podsumowanie wielu kolumn z danymi.tabela
Próbuję użyć danych.tabela przyspieszająca przetwarzanie dużych danych.ramka (300k x 60) wykonana z kilku mniejszych scalonych danych.ramki. Jestem nowy w data.stolik. Dotychczasowy kod wygląda następująco
library(data.table)
a = data.table(index=1:5,a=rnorm(5,10),b=rnorm(5,10),z=rnorm(5,10))
b = data.table(index=6:10,a=rnorm(5,10),b=rnorm(5,10),c=rnorm(5,10),d=rnorm(5,10))
dt = merge(a,b,by=intersect(names(a),names(b)),all=T)
dt$category = sample(letters[1:3],10,replace=T)
I zastanawiałem się, czy istnieje bardziej efektywny sposób niż poniższy, aby podsumować dane.
summ = dt[i=T,j=list(a=sum(a,na.rm=T),b=sum(b,na.rm=T),c=sum(c,na.rm=T),
d=sum(d,na.rm=T),z=sum(z,na.rm=T)),by=category]
Nie chcę ręcznie wpisywać wszystkich 50 kolumn, a eval(paste(...))
wydaje się niezgrabny.
Spojrzałem na poniższy przykład, ale wydaje się to trochę skomplikowane dla mojego potrzeb. dzięki
1 answers
Możesz użyć prostej lapply
Instrukcji z .SD
dt[, lapply(.SD, sum, na.rm=TRUE), by=category ]
category index a b z c d
1: c 19 51.13289 48.49994 42.50884 9.535588 11.53253
2: b 9 17.34860 20.35022 10.32514 11.764105 10.53127
3: a 27 25.91616 31.12624 0.00000 29.197343 31.71285
Jeśli chcesz podsumować tylko niektóre kolumny, możesz dodać .SDcols
argument
# note that .SDcols also allows reordering of the columns
dt[, lapply(.SD, sum, na.rm=TRUE), by=category, .SDcols=c("a", "c", "z") ]
category a c z
1: c 51.13289 9.535588 42.50884
2: b 17.34860 11.764105 10.32514
3: a 25.91616 29.197343 0.00000
To oczywiście nie jest ograniczone do sum
i możesz używać dowolnej funkcji z lapply
, w tym funkcji anonimowych. (tzn. jest to zwykłe lapply
stwierdzenie).
Wreszcie, nie ma potrzeby stosowania i=T
i j= <..>
. Osobiście uważam, że to sprawia, że kod jest mniej czytelny, ale jest to tylko preferencja stylu.
EDIT: dokumentacja
Znajdziesz dokumentację .SD
i kilka innych zmiennych specjalnych pod
sekcja pomocy ?"[.data.table"
(w sekcji argumenty poszukaj pod info dla by
).
Spójrz również na dane.tabela FAQ 2.1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 02:13:31