2012-11-10 2 views
0

열 이름에 유효하지 않은 문자가있는 데이터 프레임이 rlm()에서 오류의 원인입니다.rlm()에 잘못된 문자가 발생했습니다

더 자세히 살펴보면 rlm() 내에서 변수 xvars에 수식의 설명 변수 이름이 포함되어 있지만 문제의 이름 주위에 역 따옴표가 붙는 것으로 나타납니다.

Error in `[.data.frame`(mf, xvars) : undefined columns selected 

이 예상 된 동작입니다 : xvars가 데이터 프레임에 인덱스로 사용되는 그런 때, namesly mf[xvars] 다음과 같은 오류가 발생합니다? (나는 이라는 키워드 문구가 문자가 아님을 알고 있습니다.) 같은 모델과 데이터 프레임에서 lm()을 호출하면 문제가 발생하지 않습니다.

# SAMPLE DATA 
mydf <- data.frame(matrix(rnorm(36),ncol=6)) 
colnames(mydf) <- c("y", "x1", "x2", "x1^2", "x2^2", "x1:x2") 

rlm(y~., data=mydf) # Error 

lm(y~., data=mydf) # No Problem 

# Clean up column names 
colnames(mydf) <- make.names(colnames(mydf)) 
rlm(y~., data=mydf) # No Problem 

MASS:::rlm.formula에서 살펴보면, 오류가
다음 줄에 mf[xvars]에 의해 발생 나타납니다

xlev <- if (length(xvars) > 0L) { 
    xlev <- lapply(mf[xvars], levels) 
    xlev[!sapply(xlev, is.null)] 
} 

역 따옴표가 추가되고 왜 어떤 생각이 있지만이 다음 오류의 원인?


정보 추가 나는 RLM() 함수를 복사 dput(mf) & dput(xvars)을 추가하고 다음 값을 얻었다. xvars의 값이 위에 지정된 이름과 다릅니다 (즉, 백틱이 추가됨). 또한 mf의 이름은 위에 주어진 이름과 동일합니다.

# dput yielded 
mf <- structure(list(y = c(-0.242914027018629, 0.724255425682537, -0.0578467214604185, -0.274193999595702, -0.38985000750839, 0.406046200943395), x1 = c(1.53071709960635, -1.87493297716611, 1.0936519723035, -0.977011182431237, -0.510890461021046, 1.20136627562427), x2 = c(-0.801995963036553, 1.30590232081605, 0.635922235436178, -1.86824341731708, -2.76797814532917, -0.497992681627495), `x1^2` = c(0.914146279518207, 0.103458073891876, -1.29818230391818, -0.629048606358592, 1.71534374557621, 0.922690967521984), `x2^2` = c(-0.0879726513660469, 1.05299413769867, 1.01955640371072, 0.546413685721721, 0.947757793667223, -0.0998700630220064), `x1:x2` = c(-0.757490494166813, 1.31307393014016, 1.90233916482184, 0.68844011701049, -1.28717997826724, -0.581800325341162)), .Names = c("y", "x1", "x2", "x1^2", "x2^2", "x1:x2"), terms = y ~  x1 + x2 + `x1^2` + `x2^2` + `x1:x2`, row.names = c(NA, 6L), class = "data.frame") 
xvars <- c("x1", "x2", "`x1^2`", "`x2^2`", "`x1:x2`") 

mf[xvars] 
# Error in `[.data.frame`(mf, xvars) : undefined columns selected 


# Removing the backticks from xvars eliminates the error. 
xvars <- sapply(xvars, function(x) gsub("`", "", x)) 
mf[xvars2] # No Error 
+0

왜 R 함수에 버그가 있는지 묻는 질문이 있습니다. – hadley

+0

@hadley 선명도가 부족하여 죄송합니다. 원래이 lm()을 실행하고 rlm()을 실행하려고 할 때 질문 제목이 오도 된 것입니다. 질문은 정말 backticks가 추가되고 있지만 오류가 발생하는 이유입니다. 이것을 약간 정리해 보겠습니다. –

+0

확실한 대답은 수식 연산자 인 목록 이름에 문자를 사용하지 않는 것입니다. 나는 확실히 말할 수는 없지만 이것이 내가 혼란 스럽다는 것을 의심 할 것이다. –

답변

2

귀하의 문제가 아닌 syntatic 변수 이름을 사용하고있는 사실로 요약된다.

이러한 정보는 신중하게 사용해야하며 패키지 작성자가 발생할 수있는 문제를 예측할 수 있습니다.

xlev <- if (length(xvars) > 0L) { 
     xlev <- lapply(mf[xvars], levels) 
     xlev[!sapply(xlev, is.null)] 
    } 

에 사용 후 다음 xvars

xvars <- as.character(attr(mt, "variables"))[-1L] 

rlm.formula을 만드는 방법에 formula

Variable names can be quoted by backticks like this in formulae, although there is no guarantee that all code using formulae will accept such non-syntactic names.

문제에 대한 도움말을 인용하고하는 등의 어떤, 표시, 작동하지 않음

이렇게하면 구문이 아닌 이름에 대해 역 따옴표로 묶인 변수가 만들어집니다. 그들이 이미 역임 된 경우, 이중 역 따옴표로 된 이름을 만듭니다.

즉, 열 이름이 "x1^2" 인 경우 xvar의 요소는 "`x1^2`"이됩니다.열 이름이 'a' 때문에

이 예

x <- data.frame(`a` = 1) 
> x[,'`a`'] 

Error in `[.data.frame`(x, , "`a`") : undefined columns selected 

에 대한 [.data.frame 실패하지 `a`

당신은 열 이름을 백틱 경우

즉, 열 이름 "`x1^2`", 요소에있는 경우 xvar"``x1^2``"이됩니다. 다시 data.frame

이유 lm 작품의 열 아니다

는 직접적으로 전달하는 대신이 디자인 매트릭스 x을 정의 할 수 model.matrix를 사용하여,이 정의와 xvars의 사용을 시도하지 않는다는 것입니다 lm.fit

당신은 당신이 사용 할 수 있습니다 다음 모델 y ~ x1 + x2 + x1:x2 +x1^2 + y1^2에 맞게하려면

이 경우 data.frame (또는 평가 환경의 객체)에 세 개의 열만 필요합니다. y, x1x2. I() 함수는 변수에 대해 산술 연산을 수행 할 수 있으므로 은 기호로 구문 분석됩니다. terms.formula

+0

'I()'라는 이름의 의미는 무엇입니까? 'colnames (mydf) <- make.names (c ""y ","x1 ","x2 ","x1^2 ","x2^2 ","x1 : x2 "를 사용하여 구문 이름을 강제로 사용하지 않도록 할 수 있습니다. "))') – mnel