У меня есть привычка обращаться к столбцам data.table в j
, даже когда мне это не нужно:
require(data.table)
set.seed(1); n = 10
DT <- data.table(x=rnorm(n),y=rnorm(n))
frm <- formula(x~y)
DT[,lm(x~y)] # 1 works
DT[,lm(frm)] # 2 fails
lm(frm,data=DT) # 3 what I'll do instead
Я ожидал, что # 2 сработает, так как lm
должен искать переменные в DT
, а затем в глобальной среде... Есть ли элегантный способ заставить что-то вроде # 2 работать?
В этом случае я использую lm
, который принимает аргумент «данные», поэтому № 3 работает просто отлично.
ИЗМЕНИТЬ Обратите внимание, что это работает:
x1 <- DT$x
y1 <- DT$y
frm1 <- formula(x1~y1)
lm(frm1)
и это тоже:
rm(x1,y1)
bah <- function(){
x1 <- DT$x
y1 <- DT$y
frm1 <- formula(x1~y1)
lm(frm1)
}
bah()
EDIT2. Однако это не удается, что иллюстрирует ответ @eddi
frm1 <- formula(x1~y1)
bah1 <- function(){
x1 <- DT$x
y1 <- DT$y
lm(frm1)
}
bah1()
DT[, lm(frm, .SD)]
(см. здесь< /а>). - person Arun   schedule 11.10.2013lm
выглядел в нужном месте (вместо использования аргумента data=, который кажется неуклюжим внутри data.table), но похоже, что есть никто. - person Frank   schedule 11.10.2013m <- quote(lm(x~y)); DT[,eval(m)]
. - person Josh O'Brien   schedule 11.10.2013j
, и потому что обычноdata.table
использует только те столбцы, которые он может обнаружить (и потому что он может быть только таким умным, прежде чем стать всемогущим;)) - я не пробовал это пока, но я думаю, что если вы даже сделаете{x; y; lm(frm)}
, это сработает. Может быть, здесь есть FR, чтобы использовать.SDcols
для обозначения столбцов, используемых, даже если нет.SD
- person eddi   schedule 11.10.2013j
, в том смысле, что мойj
ищет их ... Я попробовал то, что вы предложили, а такжеDT[,{x <- x;y <- y;lm(frm)}]
, но без костей. Да, было бы неплохо иметь возможность использовать .SDcols без .SD. - person Frank   schedule 11.10.2013j
искать их — это очень абстрактное утверждение, требующее понимания на уровне ИИ того, что делает вашj
. Я немного удивлен, что явное использованиеx
иy
этого не сделало, должно быть, я неправильно понимаю основную проблему. Re FR: пожалуйста, добавьте это. - person eddi   schedule 11.10.2013lm
- она ищет эти переменные в среде формулы, поэтому добавление переменных в средуj
(используя их каким-либо образом) не помогает, так как среда формулы.GlobalEnv
здесь. - person eddi   schedule 11.10.2013lm
, но я не уверен, в чем именно он не соответствует. Я отредактировал пару примеров выше. - person Frank   schedule 11.10.2013