Используйте имена столбцов в качестве входных данных для формулы в data.table
Я хочу использовать имена столбцов data.table в качестве входных данных для моей формулы. Тем не менее, каждый раз, когда я вставляю имя строки напрямую, это работает. Если я загружаю имя из объекта, оно не работает. Я думаю, что это связано с тем, что
library(data.table)
dt <- data.table(ID= c(1,2,3,4,5,6,7,8,9),
var1 = c(100,150,200,180,10,15,11,25,1),
var2 = c(150,200,250,300,15,20,19,30,2),
var3 = c(100,101,102,103,104,105,106,107,109))
# Insert column name direvtly in Formular seems to work
dt[, var1 := ( var1 - mean(var1, na.rm = TRUE)/sd(var1, na.rm = TRUE)) ]
# Load name from formular does not work
Names <- c("var1", "var2", "var3")
for (i in 1:3){
dt[, Names[i] := ( Names[i] - mean(Names[i], na.rm = TRUE)/sd(Names[i], na.rm = TRUE)) ]}
Я думаю, что это связано с тем, что Names[1] дает мне "var1" вместо var1. Я искал похожие проблемы на форуме и нашел такие команды, как as.symbol()
, as.name()
что, хотя, кажется, не помогает.
1 ответ
Решение
Одним из вариантов является использование get
чтобы получить значения от объекта
for (i in 1:3){
dt[, (Names[i]) := ( get(Names[i]) - mean(get(Names[i]),
na.rm = TRUE)/sd(get(Names[i]), na.rm = TRUE)) ]
}
Или другой вариант set
for(j in Names){
set(dt, i = NULL, j = j, value = (dt[[j]] - mean(dt[[j]],
na.rm = TRUE)/sd(dt[[j]], na.rm = TRUE)))
}
dt
# ID var1 var2 var3
#1: 1 99.05324836 149.060863 64.52132
#2: 2 149.05324836 199.060863 65.52132
#3: 3 199.05324836 249.060863 66.52132
#4: 4 179.05324836 299.060863 67.52132
#5: 5 9.05324836 14.060863 68.52132
#6: 6 14.05324836 19.060863 69.52132
#7: 7 10.05324836 18.060863 70.52132
#8: 8 24.05324836 29.060863 71.52132
#9: 9 0.05324836 1.060863 73.52132
Или укажите Names
в .SDcols
, перебрать Подмножество Data.table, сделать расчет и назначить (;=
) вывод обратно в столбцы в Names
dt[, (Names) := lapply(.SD, function(x) x- mean(x, na.rm = TRUE)/sd(x,
na.rm = TRUE)), .SDcols = Names]