Ho questo problema con data.table
che mi sta facendo impazzire di recente. Sembra un bug ma potrebbe essermi perso qualcosa di ovvio qui.data.table NON riepilogando correttamente da due colonne
Ho la seguente struttura dei dati:
# First some data
data <- data.table(structure(list(
month = structure(c(1356998400, 1356998400, 1356998400,
1359676800, 1354320000, 1359676800, 1359676800, 1356998400, 1356998400,
1354320000, 1354320000, 1354320000, 1359676800, 1359676800, 1359676800,
1356998400, 1359676800, 1359676800, 1356998400, 1359676800, 1359676800,
1359676800, 1359676800, 1354320000, 1354320000), class = c("POSIXct",
"POSIXt"), tzone = "UTC"),
portal = c(TRUE, TRUE, FALSE, TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE,
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
),
satisfaction = c(10L, 10L, 10L, 9L, 10L, 10L, 9L, 10L, 10L,
9L, 2L, 8L, 10L, 9L, 10L, 10L, 9L, 10L, 10L, 10L, 9L, 10L, 9L,
10L, 10L)),
.Names = c("month", "portal", "satisfaction"),
row.names = c(NA, -25L), class = "data.frame"))
voglio riassumere esso sia portal
e month
. Riassumendo con il buon vecchio tapply
opere come previsto - ho matrice 3x2 con i risultati per Dic-2012 e gennaio-febbraio 2013:
> tapply(data$satisfaction, list(data$month, data$portal), mean)
FALSE TRUE
2012-12-01 8.5 8.000000
2013-01-01 10.0 10.000000
2013-02-01 9.0 9.545455
Riassumendo con by
argomento data.table
non lo fa:
> data[, mean(satisfaction), by = 'month,portal']
month portal V1
1: 2013-01-01 FALSE 10.000000
2: 2013-02-01 TRUE 9.000000
3: 2013-01-01 TRUE 10.000000
4: 2012-12-01 FALSE 8.500000
5: 2012-12-01 TRUE 7.333333
6: 2013-02-01 TRUE 9.666667
7: 2013-02-01 FALSE 9.000000
8: 2012-12-01 TRUE 10.000000
Come si vedere, restituisce una tabella di dati con valori , non come previsto; valori dove portal == TRUE
e month == 2012-02-01
sono duplicati, per esempio.
È interessante notare che, se mi limito dati questo solo per 2013 di, tutto funziona come previsto:
> data[month >= ymd(20130101), mean(satisfaction), by = 'month,portal']
month portal V1
1: 2013-01-01 TRUE 10.000000
2: 2013-01-01 FALSE 10.000000
3: 2013-02-01 TRUE 9.545455
4: 2013-02-01 FALSE 9.000000
Sono perplesso di là credo :). Qualcuno potrebbe aiutarmi?
Utilizzare 'by = list (month, portal)' – Andrie
In primo luogo, 'data [, mean (soddisfazione), per = list (mese, portale)]' produce lo stesso risultato (errato). In secondo luogo, secondo l'aiuto di 'data.table', sono supportate entrambe le sintassi:" by - Un singolo nome di colonna non quotato, un elenco() di espressioni di nomi di colonne, una stringa di singolo carattere contenente i nomi di colonna separati da virgola o un vettore di carattere di nomi di colonne." –
La conversione della colonna POSIX in data (' as.Date') sembra funzionare.Penso che data.table sia (correttamente? Erroneamente?) Dividendo alcuni capelli se alcune di quelle date sono "uguali". – joran