У меня есть data.table DT
со столбцом с именем RF
и множеством столбцов с подчеркиванием _
.Я хочу перебрать все эти столбцы с подчеркиванием и вычесть из него столбец RF
.Тем не менее, я застрял.Кажется, что все, что касается RHS оператора :=
в data.table
, не работает с динамическими переменными.
Вот мой DT
и требуемый вывод (в жестком коде):
library(data.table)
DT <- data.table(RF = 1:10,
S_1 = 11:20,
S_2 = 21:30)
#Desired output
DT[ , S_1 := S_1 - RF]
DT[ , S_2 := S_2 - RF]
DT
RF S_1 S_2
[1,] 1 10 20
[2,] 2 10 20
[3,] 3 10 20
...
Тем не менее, я хочу, чтобы это было более гибким, т. Е. Перебирал все столбцы с «_» в имени и вычитал RF
:
#1. try: Does not work; Interestingly, the i on the LHS of := is interpreted as the column i, but on the RHS of
#:= it is interpreted as 2 and 3, respectively
for (i in grep("_", names(DT))){
DT[ , i:= i - 1, with=FALSE]
}
DT
RF S_1 S_2
[1,] 1 1 2
[2,] 2 1 2
[3,] 3 1 2
...
#2. try: Work with parse and eval
for (i in grep("_", names(DT), value=TRUE)){
DT[ , eval(parse(text=i)):= eval(parse(text=i)) - RF]
}
#Error in eval(expr, envir, enclos) : object 'S_1' not found
Любые советы, как это было бы здорово.
РЕДАКТИРОВАТЬ: Как только я опубликовал вопрос, я подумал про себя: почему вы вообще работаете с оператором :=
, и, конечно же, я просто понял, что мне не нужно,Это работает и не нуждается в цикле:
DT[, grep("_", names(DT)), with=FALSE] - DT[, RF]
Извините за это.Однако я оставляю вопрос открытым, потому что мне все еще интересно, почему мой подход с оператором :=
не работает.Так что, может быть, кто-то может помочь мне там.