Прокрутите столбцы в таблице data.table и преобразовать эти столбцы

У меня есть таблица data.table DT со столбцом с именем RF и множеством столбцов с подчеркиванием _ в нем . Я хочу прокрутить все эти столбцы с помощью подчеркните и вычтите из него столбец RF . Однако я застрял. Кажется, что все на правой стороне Оператор : = в 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]

Извините за это. Однако я оставляю вопрос открытым, потому что меня все еще интересует, почему мой подход с оператором : = не работает. Так что, может быть, кто-нибудь сможет мне помочь.

28
задан Christoph_J 4 December 2011 в 11:07
поделиться