2013-07-28 43 views
1

我有一個問題,花了我的週末後,我想請求幫助。要解釋這個問題,我想直接跳到一個例子:R:如何使用lm-formula的「數據」參數作爲角色?

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.namef。隨着子設置,我遇到了parse的問題,因爲dat現在是一個帶括號的字符向量。

作爲一個側面說明:我爲什麼要回收從lm - 函數的data -argument而不是僅僅使用與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

的確,這也很有用。我想我會和Ben的建議一起去的。我認爲eval在本地環境中創建了對象的副本(這裏是:dataframe),對吧?由於我的真實數據幀很大,我想避免出於計算目的。不過謝謝! – coffeinjunky

+1

是的,'eval'複製臨時環境中的對象,但你必須檢查你的'deparse'解決方案的內存使用情況,我沒有嘗試自己。 – dickoa

+0

是的,我同意。我現在實際上比較了兩種方法,令人驚訝的是,deparse-solution比eval-solution慢。但其他的事情也不同。稍後我會更多地考慮這一點,只是爲其他讀者提及這一點。無論如何,非常感謝Dickoa!你們真的很有幫助。 – coffeinjunky