Ho un data.table
su cui vorrei eseguire operazioni di gruppo, ma vorrei conservare le variabili nulle e utilizzare diversi gruppi di variabili di gruppo.Operazioni tabella dati con gruppo multiplo per set di variabili
Un esempio giocattolo:
library(data.table)
set.seed(1)
DT <- data.table(
id = sample(c("US", "Other"), 25, replace = TRUE),
loc = sample(LETTERS[1:5], 25, replace = TRUE),
index = runif(25)
)
Mi piacerebbe trovare la somma di index
da tutte le combinazioni di variabili chiave (tra cui il set null). Il concetto è analogo a "set di raggruppamenti" di Oracle SQL, ecco un esempio della mia soluzione attuale:
rbind(
DT[, list(id = "", loc = "", sindex = sum(index)), by = NULL],
DT[, list(loc = "", sindex = sum(index)), by = "id"],
DT[, list(id = "", sindex = sum(index)), by = "loc"],
DT[, list(sindex = sum(index)), by = c("id", "loc")]
)[order(id, loc)]
id loc sindex
1: 11.54218399
2: A 2.82172063
3: B 0.98639578
4: C 2.89149433
5: D 3.93292900
6: E 0.90964424
7: Other 6.19514146
8: Other A 1.12107080
9: Other B 0.43809711
10: Other C 2.80724742
11: Other D 1.58392886
12: Other E 0.24479728
13: US 5.34704253
14: US A 1.70064983
15: US B 0.54829867
16: US C 0.08424691
17: US D 2.34900015
18: US E 0.66484697
Esiste un modo preferito "tabella dei dati" per raggiungere questo obiettivo?
Se vuoi veramente i risultati in un 'data.table', quello che fai qui va bene. Se stai solo andando a guardare i risultati, un formato tabellare, con le tue variabili per la classificazione incrociata ai margini, è molto meglio: 'stable <- tapply (DT $ index, list (DT $ id, DT $ loc) ,somma); mstable <- rbind (cbind (stabile, applica (stabile, 1, somma)), c (applica (stabile, 2, somma), somma (stabile))) '. A proposito, si prega di utilizzare 'set.seed' quando si generano dati casuali per un esempio. – Frank
Oh, in realtà è più semplice di così, dato che 'addmargins' funziona:' addmargins (stable) ' – Frank
[Oracle GROUPING SETS] (https://oracle-base.com/articles/misc/rollup-cube-grouping-functions- e-grouping-set # grouping_sets) potrebbe essere fatto da un data.table funzioni di alto livello, non richiesto internals, simile a quello che hai fatto. Raccomando di riempire una richiesta di funzionalità per quella funzione. – jangorecki