2016-08-25 3 views
0

R 프로그래밍에 대한 제한된 지식으로 작은 R 패키지를 만들려고합니다. X 벡터, 'A'와 'B'일"수식"을 분할하는 방법 R

formula=~a+b*X 

함수 호출에 상수 : 나는 다음과 같은 인수를 사용하는 것을 시도하고있다.

일단 내가 수식을 입력하면, (a,b)과 X를 따로 추출하고 함수 호출 내에서 다른 데이터 조작을 위해 사용하려고합니다. R에서 할 수있는 방법이 있습니까?

나는 정말로 어떤 지침을 부탁드립니다.

참고 : 나는() 출력을 model.matrix 유사한 무언가를 찾고 있어요 선명도

에 대한 내 질문에 편집. 전술 한 수식에서

~ 2 + 3 * X + 4 * Y + ... + 2 * Z

, 'N'변수 말하자면 수 수용하도록 더 일반화 될 수있다 출력으로, 나는 계수로 (2 3 4 ... 2)를 벡터로, [1 XY ... Z]를 공변량 행렬로 필요로한다.

+0

이것은 매우 명확하지 않습니다. 그것은 나에게, X는 사용자가 입력하는 데이터이고 a와 b는 추정 할 매개 변수 일 수 있습니다. 그렇다면, X는 사용자에 의해 제공되고 a 및 b는 일부 추정 함수로부터 리턴 된 값이다. R에서 수식 = ...은 인수가 아니라 옵션 (Stata background?)이라고합니다. 나의 충고 :'lm''glm'과'nls'에서 1 주일 정도 계수를 추출하여 놀아보십시오. 그런 다음이 프로젝트로 이동하십시오. – lmo

+0

@Imo 죄송합니다. 분명하지 않은 경우. 내 함수에서 "수식"인수를 전달하고 사용자가 a, b 및 X를 다항식으로 입력 할 수 있다고 말합니다. 나는 a와 b가이 경우 매개 변수가 아닌 상수라고 말해야한다. – Vineetha

답변

4

질문이 완전히 명확하지 않으므로 표준 수식 구문을 사용하는 수식이 주어지면 출력으로 제공하는 변수 이름 (또는 두 번째 대답은 변수 이름과 상수)을 어떻게 파싱해야합니까? 그것들을 포함한 문자 벡터

1)이 시도 all.vars : 제공

fo <- a + b * X # input 
all.vars(fo) 

:

[1] "a" "b" "X" 

2)는 또한 우리는 문자열 조작과 그것을 할 수 strapplyc. 이 경우에는 상수를 파싱합니다.

library(gsubfn) 
fo <- ~ 25 + 35 * X # input 
strapplyc(gsub(" ", "", format(fo)), "-?[0-9.]+|[a-zA-Z0-9._]+", simplify = unlist) 

제공 :

[1] "25" "35" "X" 

참고 : 당신이하려고하는 모든 경우 에이을 평가에 R 식으로 식의 RHS는 단지입니다 :

X <- 1:3 
fo <- ~ 1 + 2 * X 
eval(fo[[2]]) 

주는 :

[1] 3 5 7 

업데이트 : 두 번째 해결 방법과 참고 사항을 수정하여 추가했습니다.

+0

'a'와 'b'가 상수 인 경우 a.vars는 X 만 반환하기 때문에 작동하지 않습니다. 저는 (a, b)와 벡터 X를 찾고 있습니다. – Vineetha

+0

@ user20650, 여기 공식은 사용자 입력입니다. , a와 b는 상수 값이고 X는 공변량 벡터이다. 상황은 lm() /predict.lm() 함수와 비슷하지만 응답 변수가 없기 때문에 모델에 적합하지 않습니다. 만약 계수 (또는이 경우 상수), 즉 (a, b)와 X 벡터를 추출 할 수 있다면, 이것을 현재 함수 호출 내에서 다른 함수로 전달할 수 있습니다. a + b * X는 다중 선형 형태로 일반화 될 수있다. 희망이 지금은 더 분명하다. – Vineetha

+0

감사합니다. strapplyc()를 사용하는 두 번째 방법은 흥미 롭지만 다른 라이브러리를 호출하지 않고이 작업을 수행 할 수있는 방법이 있습니다. 또한 X에 저장된 값을 얻으려면 어떻게해야합니까? 나는 더 많은 변수들을 통합하고 그것들 각각을 상수와 함께 추출하기를 원한다. 이견있는 사람? – Vineetha

4

호출은 기호 및/또는 다른 호출 목록이며 해당 요소는 일반적인 인덱싱 작업을 통해 액세스 할 수 있습니다.

f <- ~a+bX 
f[[1]] 
#`~` 
f[[2]] 
#a + bX 
f[[2]][[1]] 
#`+` 
f[[2]][[2]] 
#a 

그러나 수식 bX에있는 것을 알 당신은 아마 대신 b * X을 의미 하나의 상징이다.

f <- ~a + b * X 

그런 ab은 일반적으로 평가되지 않은 목록에 저장됩니다.

vars <- call('list', f[[2]][[2]], f[[2]][[3]][[2]]) 
vars 
#list(a, b) 

vars는 어떤 점에서 eval에 전달 될 것입니다.

+0

b * X를 지적 해 주셔서 감사합니다. X에 저장된 값을 얻으려면 어떻게해야합니까? f를 일반화 할 수 있습니까? 예 : f <- 2+ 3.5 * X + Y + z ...? 다른하실 말씀 있나요? – Vineetha

+0

'X'는'f [[2]] [3] [[3]]'에 있습니다. 일반화하려면 수식에서 요소를 찾아 추출하는 파서를 작성해야합니다. 수식의 유형에 따라 복잡 할 수 있습니다. –

+0

@ Ernest A : 수식은 계수가있는 "n"개의 변수를 가질 수 있습니다 (예 : 2 + 3 * x + 4 * y + 0.1 * z). R 프로그래밍에 대한 제한된 지식으로 파서에 대해 언급 한 내용을 소화하기가 쉽지 않습니다. 파서를 작성하기위한 몇 가지 예를 제공해 주실 수 있습니까? 감사! – Vineetha