2013-06-18 1 views
2

나는 이것이 그렇게 어려울 것이라고 생각하지는 않았지만 얼마 동안 고생했습니다 ... 나는 그것이 누락 된 단순한 것이기를 바랍니다 :) 나는 능력이 있어야합니다. 문자열과 숫자가 혼합 된 변수를 포함하는 데이터 프레임을 논리적으로 쿼리합니다.혼합 된 (문자 및 숫자) 변수에 대한 논리적 쿼리

LAMBDA<-data.frame(cbind(list(1,"lequiv"),list("lequiv",0))) 
LAMBDA!=1 

명확하게 1이 아닌 문자열이 NA가 아닌 FALSE로보고되도록하려면이 방법을 사용하는 것이 가장 좋습니다. 감사합니다. .

+1

측면 참고 : 나는 data.frame'를 통해 데이터 프레임을 만드는 습관 나갈 것입니다 (cbind())'. 그것은 당신이 의도 한 것을 자주하지 않는 끔찍한 숙어입니다. – joran

+0

Joran이 왜 똑같이 간결한 접근법이 있는지 설명 할 수 있습니까? 이 경우 실제로는 다른 함수의 인수이므로 간결함은 특히 유용합니다. – Charlie

+0

글쎄, 이것에 관한 모든 것은 매우 드문 경우입니다. 데이터 프레임은 목록을 "열"로 유지하지만 일반적으로 데이터 프레임을 받아들이는 많은 많은 함수가 단일 유형의 열을 암시 적으로 가정하기 때문에 목록을 볼 수 없습니다. 그래서 정말로 목록 열이있는 데이터 프레임을 가지고 있다면 (그리고 내가하는 일이 매우 의심 스럽습니다), 아마도 이것은 만들 수있는 좋은 방법 일 것입니다; 그러나이 관용구는 결코 다른 어떤 상황에서도 사용되어서는 안됩니다. – joran

답변

4

숫자 1과 같은 요소를 테스트하는 대신 문자열 "1"과 같은 요소를 테스트 해 볼 수 있습니다. 예를 들어

> LAMBDA!="1" 
     X1 X2 
[1,] FALSE TRUE 
[2,] TRUE TRUE 

는 반면 : 첫 번째 경우

> LAMBDA!=1 
     X1 X2 
[1,] FALSE NA 
[2,] NA TRUE 

, R은 동등성을 테스트하기 전에 문자열로 데이터 프레임에 값 1을 강제 설정하기도한다. 두 번째 경우에는 "lequiv"를 동등성을 테스트하는 숫자로 강요 할 수 없으므로 NA (및 경고 메시지)가 반환됩니다.

+0

나는 단순함으로이 대답을 좋아하지만, 논리를 구현하는 좀 더 명확한 방법이 있는지 궁금하다. 첫 번째 인상은 요소 숫자 (또는 문자가 아님)이지만이 메서드는 작동하지 않습니다. b/c'class()'는 "list"를 반환합니다. 리스트 안에있는 클래스들은'str()'에 나타납니다. – rbatt

+1

막연한 "영리한"성향을 R에 부여하는 것이 특히 도움이된다고 생각하지 않습니다. Ops 클래스의 함수가 어떻게 전달되고 어떤 종류의 강제 변환이 수행되는지 토론하는 것이 좋습니다. –

1

여기 요인을 찾고 있다고 생각합니다.

str(LAMBDA)을 보면 X1은 두 개의 요소 (하나는 문자로 저장 됨)로 구성된 목록임을 알 수 있습니다.

다음과 같이 대신 목록을 작성하는 경우 : 인쇄 할 때

l1 <- data.frame(X1=c(1,"lequiv"), 
       X2=c("lequiv",2) 
       ) 

그냥 같은 보이지만 변수가 요소로 표시됩니다.

그런 다음 l1==1이 제공 :

 X1 X2 
[1,] TRUE FALSE 
[2,] FALSE FALSE 
+0

음 ... 예상대로 작업을 직접 수행하는 것이 좋겠지 만, 다른 문제가 연속 숫자의 긴 목록 (즉, 요소의 분리 된 수준이 아님)이 수준으로 해석되어 있다고 가정 할 때 맞습니다. ? 또는 데이터 구조의 다른 요소를 사용하려는 경우에만 문제가됩니까? – Charlie

+0

잘 모르겠습니다 -'data.frame'에 항목으로'list'를 저장하려고합니까? 할 수 있습니다 - [여기] (http://stackoverflow.com/questions/2321786/best-way-to-store-variable-length-data-in-an-r-data-frame)를 참고하십시오. '=='연산자를 사용하기 위해'list '를'double'으로 강요합니다. 다행 인 것을 발견해서 다행입니다. – dardisco