Элегантное назначение нескольких столбцов в data.table с помощью lapply ()

Я пытаюсь найти элегантный способ использования:= назначение заменить много столбцов одновременно вdata.table применяя общую функцию. Типичным использованием этого может быть применение строковой функции (например,gsub) ко всем символьным столбцам в таблице. Это не сложно продлитьdata.frame способ сделать это сdata.table, но я ищу метод в соответствии сdata.table способ делать вещи.

Например:

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)

Я понимаю, что более эффективно перебирать вектор имен столбцов, используя:= назначить:

for (col in paste0("V", 20:100)) dt[, col := sqrt(dt[[col]]), with = FALSE]

Мне не нравится это, потому что я не люблю ссылаться наdata.table вj выражение. Я также знаю, что я могу использовать:= назначить сlapply учитывая, что я знаю имена столбцов:

dt[, c("V20", "V30", "V40", "V50", "V60") := lapply(list(V20, V30, V40, V50, V60), sqrt)]

(Вы можете расширить это, создав выражение с неизвестными именами столбцов.)

Ниже приведены идеи, которые я попробовал, но не смог заставить их работать. Я ошибаюсь, или мне не хватает другого подхода?

# 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)]

Ответы на вопрос(3)

Ваш ответ на вопрос