2013-07-28 3 views
1

У меня проблема, и, проведя выходные, я хотел бы попросить о помощи. Чтобы объяснить эту проблему, я хотел бы перейти непосредственно в пример:R: Как использовать «данные» -аргумент lm-формулы как символ?

df <- data.frame(x=rnorm(100), z=rnorm(100), y=rnorm(100), f=rep(1:5,length.out=100)) 
mod <- lm(y ~ x, data=df[df$z>0,]) 

Я хочу перерабатывают данных-аргумент модели:

dat <- mod$call[['data']] 

Это дает мне:

df[df$z > 0, ] 

Однако str(dat) покажет, что это объект типа language. Однако я хочу использовать это выражение для доступа к фрейму данных, который использовался в lm (включая подзадачу), чтобы получить соответствующие значения другой переменной, например f. Обратите внимание, что преобразование объекта языка в символ с as.character() приведет к символьному вектору, а некоторые из скобок будут потеряны.

Я хочу, чтобы использовать эту функцию внутри функции, и то, что я ищу что-то вроде этого:

foo <- function(fm, "var.name"){ 
     new <- paste(dat, "$", var.name, sep="") 
     newvar <- eval(parse(text=new), envir=.GlobalEnv) 
     ... do stuff with newvar ... 
} 

Без суб-настройки, эта процедура дает мне переменную f если я указываю var.name в f. С подстановкой я столкнулся с проблемами с parse из-за того, что dat теперь является символьным вектором с скобками.

В качестве побочного примечание: причина, почему я хочу, чтобы переработать data -argument от lm -функции, а не только с использованием того же выражения с var.name, что я изменить суб-настройки довольно часто, и с его признали от lm-объекта делает мою жизнь намного проще. Он также удаляет источник ошибки.

Я был бы весьма признателен, если кто-то может помочь мне здесь ...

+1

вы смотрели на 'deparse()'? –

+1

Как насчет 'mod $ model'? У него будут 'x' и' y', этого достаточно? – flodel

+0

Бен, спасибо большое! Я фактически использую deparse в другой части моего кода. Ужас, что я об этом не думал. Большое спасибо! – coffeinjunky

ответ

3

Вы можете просто eval это выражение как этот

foo <- function(model, varname) eval(model$call[["data"]])[,varname] 
foo(mod, "f") 
## [1] 2 5 2 5 1 2 1 5 2 3 1 2 3 1 3 4 1 3 4 1 2 3 2 4 1 4 1 2 4 5 
## [31] 2 4 2 3 4 2 2 3 4 1 3 1 2 
+0

Правда, это тоже полезно. Я думаю, что я пойду с предложением Бена. Я думаю, что eval делает копию объекта (здесь: dataframe) в локальной среде, не так ли? Поскольку мой реальный фреймворк огромен, я хочу избежать этого в вычислительных целях. Спасибо, тем не менее! – coffeinjunky

+1

Да, верно, что 'eval' копирует объект во временную среду, но вы также должны проверить использование памяти вашего решения' deparse', я сам не пробовал. – dickoa

+0

Да, согласен. Я на самом деле сравниваю два метода на данный момент, и, на удивление, решение о депаре медленнее, чем решение eval. Но другие вещи разные. Я расскажу об этом позже, просто упомянув об этом для других читателей. В любом случае, спасибо большое Дикоа! Вы, ребята, очень полезны. – coffeinjunky