Ich habe eine Reihe von data.tables in einer Liste. Ich möchte unique()
auf jede data.table in meiner Liste anwenden, aber dadurch werden alle meine data.table-Schlüssel zerstört.Warum speichert lapply() meine data.table-Schlüssel nicht?
Hier ist ein Beispiel:
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)
Hier hat blah
noch einen Schlüssel, und alles ist richtig auf der Welt:
key(blah)
# [1] "a"
Aber wenn ich die data.tables zu einer Liste hinzuzufügen und verwenden lapply()
, erhalten die Schlüssel zerstört:
dt.list <- list(A, B)
unique.list <- lapply(dt.list, unique) # Keys destroyed here
lapply(unique.list, key)
# [[1]]
# NULL
# [[2]]
# NULL
Dies hat wahrscheinlich zu Ich verstehe nicht wirklich, was es bedeutet, dass Schlüssel "durch Verweis" zugewiesen werden, da ich andere Probleme mit dem Verschwinden von Schlüsseln hatte.
So:
- Warum meine Schlüssel nicht lapply nicht behalten?
- Was bedeutet es zu sagen, Schlüssel werden "per Referenz" zugewiesen?
- Sollte ich sogar data.tables in einer Liste speichern?
- Wie kann ich data.tables sicher speichern/manipulieren, ohne befürchten zu müssen, meine Schlüssel zu verlieren?
EDIT:
Für das, was es wert ist, die gefürchtete for
Schleife funktioniert gut, auch:
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"
Aber das ist R und for
Schleifen sind böse.
Interessanterweise 'unique.list [[1]]! = Unique (A)'. Meine Vermutung, obwohl nur eine Vermutung, ist, dass vielleicht, was in der Lapply-Anweisung aufgerufen wird, das '{base}' unique und nicht das '{data.table}' 'unique' ist. –
Ich denke, du hast Recht. Ich habe gerade bemerkt, dass - zusammen mit Schlüsseln zerstört - "unique" nicht einmal seine Arbeit macht, wenn es durch "lapply" passiert. –
@PaulMurray +1 Gute Frage, aber _destroy_ scheint ein wenig stark. Es behält sie in diesem Fall nicht. –