Ich versuche, eine elegante Möglichkeit zu finden, :=
Zuweisung zu verwenden, um viele Spalten auf einmal in data.table
durch Anwenden einer gemeinsamen Funktion zu ersetzen. Eine typische Verwendung davon könnte sein, eine Zeichenfolgenfunktion (z. B. gsub
) auf alle Zeichenspalten in einer Tabelle anzuwenden. Es ist nicht schwierig, die data.frame
Weise, dies zu einer data.table
zu tun, aber ich bin auf der Suche nach einer Methode im Einklang mit der data.table
Art und Weise, Dinge zu tun.Elegant zuweisen mehrere Spalten in data.table mit lapply()
Zum Beispiel:
library(data.table)
m <- matrix(runif(10000), nrow = 100)
df <- df1 <- df2 <- df3 <- as.data.frame(m)
dt <- as.data.table(df)
head(names(df))
head(names(dt))
## replace V20-V100 with sqrt
# data.frame approach
# by column numbers
df1[20:100] <- lapply(df1[20:100], sqrt)
# by reference to column numbers
v <- 20:100
df2[v] <- lapply(df2[v], sqrt)
# by reference to column names
n <- paste0("V", 20:100)
df3[n] <- lapply(df3[n], sqrt)
# data.table approach
# by reference to column names
n <- paste0("V", 20:100)
dt[, n] <- lapply(dt[, n, with = FALSE], sqrt)
Ich verstehe es eine Schleife über einen Vektor von Spaltennamen effizienter ist :=
mit zuzuweisen:
for (col in paste0("V", 20:100)) dt[, col := sqrt(dt[[col]]), with = FALSE]
Ich mag das nicht, weil ich don‘ t wie Referenz data.table
in einem j
Ausdruck. Ich weiß auch, dass ich :=
können mit lapply
gegeben zuweisen, dass ich die Spaltennamen kennen: (. Sie könnten dies erweitern, indem Sie einen Ausdruck mit unbekannten Spaltennamen Bau)
dt[, c("V20", "V30", "V40", "V50", "V60") := lapply(list(V20, V30, V40, V50, V60), sqrt)]
Im Folgenden sind die Ideen Ich habe es versucht, aber ich konnte sie nicht zur Arbeit bringen. Mache ich einen Fehler, oder gibt es einen anderen Ansatz, den ich vermisse?
# possible data.table approaches?
# by reference to column names; assignment works, but not lapply
n <- paste0("V", 20:100)
dt[, n := lapply(n, sqrt), with = FALSE]
# by (smaller for example) list; lapply works, but not assignment
dt[, list(list(V20, V30, V40, V50, V60)) := lapply(list(V20, V30, V40, V50, V60), sqrt)]
# by reference to list; neither assignment nor lapply work
l <- parse(text = paste("list(", paste(paste0("V", 20:100), collapse = ", "), ")"))
dt[, eval(l) := lapply(eval(l), sqrt)]
Vielen Dank für die Klammern um "col". Bis ich mich an diesen Trick erinnerte, bekam ich eine Kolumne namens "Col". – Farrel