2013-07-28 2 views
1

문제가 생겼고 주말을 보낸 후 도움을 요청하고 싶습니다.R : "데이터"- 캐릭터로서의 수식의 사용법?

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,]) 

내가 모델의 데이터 인수를 재활용 할이 :

df[df$z > 0, ] 
을 :

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

이 나에게주는 문제를 설명하기 위해, 내가 직접 예에 뛰어 싶습니다

그러나 str(dat)language 유형의 개체임을 나타냅니다. 그러나이 표현식을 사용하여 lm (하위 설정 포함)에서 사용 된 데이터 프레임에 액세스하여 다른 변수 (예 : f)의 해당 값을 가져오고 싶습니다. 언어 개체를 as.character() 문자로 변환하면 문자 벡터가 발생하고 대괄호 중 일부는 손실됩니다.

내가 함수 내에서이를 사용하려면, 그리고 내가 무엇을 찾고있는 것은이 같은 것입니다 : 내가 fvar.name를 지정하면 하위 설정하지 않고

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

,이 절차는 나에게 변수 f을 제공합니다. 하위 설정으로 dat이 대괄호가있는 문자 - 벡터가 되었기 때문에 parse의 문제가 발생합니다. 사이드 참고로

: 난 그냥 var.name와 같은 표현을 사용하는 대신 lm α- 함수에서 data -argument을 재활용 할 이유는 내가 하위 설정을 매우 자주, 그것을 가진 인식 변화이다 작품으로부터 얻은 것은 내 인생을 훨씬 쉽게 만든다. 또한 오류의 원인을 제거합니다.

사람이 여기 좀 도와 수 있다면 내가보기 엔 빚을 것

...

+1

같은 단지 eval이 표현 당신은()'deparse'살펴 보았다 수 있습니까? –

+1

'mod $ model'은 어떨까요? 그것은'x'와'y'를 가질 것입니다, 충분하니? – flodel

+0

Ben, 정말 고마워! 실제로 코드의 다른 부분에서 deparse를 사용합니다. 내가 그것을 생각하지 않았다는 당혹 스러움. 고마워요! – coffeinjunky

답변

3

는이

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은 로컬 환경에서 객체 (여기서는 데이터 프레임)의 사본을 만듭니다. 맞습니까? 실제 데이터 프레임이 거대하기 때문에 계산 목적으로이를 피하고 싶습니다. 그럼에도 불구하고 고마워! – coffeinjunky

+1

그렇습니다.'eval'은 임시 환경에서 객체를 복사하지만'deparse' 솔루션의 메모리 사용량을 확인해야합니다. 나 자신을 시도하지 않았습니다. – dickoa

+0

예, 동의합니다. 현재 실제로 두 가지 방법을 비교하고 있으며 놀랍게도 deparse 솔루션은 eval 솔루션보다 느립니다. 그러나 다른 것들도 다릅니다. 나중에 다른 독자를 위해이 점을 언급 할 것입니다. 어쨌든, Dickoa 덕분입니다! 너희들 정말 도움이된다. – coffeinjunky