Tôi đang cố gắng tìm ra cách sử dụng :=
để thay thế nhiều cột cùng lúc trong một data.table
bằng cách áp dụng một hàm được chia sẻ. Việc sử dụng điển hình điều này có thể là áp dụng một hàm chuỗi (ví dụ: gsub
) cho tất cả các cột ký tự trong một bảng. Nó không phải là khó khăn để mở rộng data.frame
cách làm điều này để một data.table
, nhưng tôi đang tìm một phương pháp phù hợp với cách data.table
làm việc.Chỉ định một cách tao nhã nhiều cột trong data.table với lapply()
Ví dụ:
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)
tôi hiểu nó là hiệu quả hơn để lặp qua một vector của các tên cột bằng :=
gán:
for (col in paste0("V", 20:100)) dt[, col := sqrt(dt[[col]]), with = FALSE]
Tôi không thích điều này vì tôi don' t như tham chiếu data.table
trong biểu thức j
. Tôi cũng biết rằng tôi có thể sử dụng :=
gán với lapply
cho rằng tôi biết tên cột: (. Bạn có thể mở rộng này bằng cách xây dựng một biểu thức với tên cột không rõ)
dt[, c("V20", "V30", "V40", "V50", "V60") := lapply(list(V20, V30, V40, V50, V60), sqrt)]
Dưới đây là những ý tưởng Tôi đã cố gắng về điều này, nhưng tôi đã không thể làm cho họ làm việc. Tôi có mắc sai lầm hay có cách tiếp cận nào khác mà tôi đang thiếu?
# 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)]
Cảm ơn bạn rất nhiều vì đã đặt dấu ngoặc đơn quanh 'col'. Cho đến khi tôi nhớ rằng, tôi đã nhận được một cột gọi là "col". – Farrel