Ho un sacco di dati. Tabelle in una lista. Voglio applicare unique()
a ogni data.table nel mio elenco, ma così facendo distruggo tutte le mie chiavi data.table.Perché lapply() non conserva le chiavi data.table?
Ecco un esempio:
A <- data.table(a = rep(c("a","b"), each = 3), b = runif(6), key = "a")
B <- data.table(x = runif(6), b = runif(6), key = "x")
blah <- unique(A)
Qui, blah
ha ancora una chiave, e tutto ciò che si trova proprio nel mondo:
key(blah)
# [1] "a"
Ma se aggiungo le data.tables per una lista e utilizzare lapply()
, i tasti vengono distrutti:
dt.list <- list(A, B)
unique.list <- lapply(dt.list, unique) # Keys destroyed here
lapply(unique.list, key)
# [[1]]
# NULL
# [[2]]
# NULL
Questo probabilmente ha a che non capisco veramente cosa significhi assegnare le chiavi "per riferimento", perché ho avuto altri problemi con le chiavi che scompaiono.
Quindi:
- Perché lapply non mantenere le mie chiavi?
- Che cosa significa dire che i tasti sono assegnati "per riferimento"?
- Devo anche memorizzare dati in una lista?
- Come posso archiviare/manipolare in modo sicuro data.tables senza timore di perdere le mie chiavi?
EDIT:
Per quello che vale, il temuto for
circuito funziona bene, anche:
unique.list <- list()
for (i in 1:length(dt.list)) {
unique.list[[i]] <- unique(dt.list[[i]])
}
lapply(unique.list, key)
# [[1]]
# [1] "a"
# [[2]]
# [1] "x"
Ma questo è R, e for
loop sono male.
interessante, 'unique.list [[1]]! = Unique (A)'. La mia ipotesi, anche se è semplicemente un'ipotesi, è che forse ciò che viene chiamato nell'istruzione lapply è l'unico '{base}' e non il '{data.table}' 'unique'. –
Penso che tu abbia ragione. Ho appena notato che - unitamente alle chiavi distrutte - 'unique' non sta nemmeno facendo il suo lavoro quando passa attraverso' lapply' –
@PaulMurray +1 Buona domanda, ma _destroy_ sembra un po 'forte. In questo caso, non li restituisce. –