2011-10-01 4 views
3

내 데이터 프레임을 필터링하기 위해이 같은 것을 사용하고 있습니다 : 나는 d1를 인쇄 할 때 예상대로데이터 프레임을 필터링 할 수 없습니까?

d1 = data.frame(data[data$ColA == "ColACat1" & data$ColB == "ColBCat2", ]) 

, 그것은 작동합니다. 그러나 d1 $ ColB를 입력해도 원래 데이터 프레임의 모든 내용이 계속 인쇄됩니다.

> print(d1) 
ColA  ColB 
----------------- 
ColACat1 ColBCat2 
ColACat1 ColBCat2 

> print(d1$ColA) 
Levels: ColACat1 ColACat2 

은 어쩌면이 예상하지만 ggplot하는 d1를 통과 할 때, 내 그래프를 엉망으로 필터를 사용하지 않고있다. 어쨌든 데이터 프레임을 필터링하고 필터와 일치하는 레코드를 얻을 수 있습니까? d1data의 존재를 알리고 싶습니다.

답변

5

언급 한 것처럼 R의 기본 동작은 데이터 프레임의 문자 열을 factor이라는 특수 데이터 형식으로 처리하는 것입니다. 이 기능은 버그가 아니지만 예상하지 못하고 제대로 사용하는 방법을 모르는 경우 유용한 기능과 마찬가지로 매우 혼란 스러울 수 있습니다.

factors은 통계에 자주 나타나는 범주 형 (숫자 또는 양적) 변수를 나타 내기위한 것입니다.

실제로 사용한 서브 세트 작업은 정상적으로 작동합니다. 즉, 데이터 프레임의 올바른 하위 집합을 반환합니다. 그러나 해당 변수의 levels 속성은 변경되지 않고 여전히 모두 원래 수준입니다.

즉, factors을 이용하도록 설계된 R로 작성된 모든 메소드는 해당 열을 많은 수의 레벨이있는 ​​범주 형 변수로 취급합니다. 통계에서, 종종 '실종'수준의 범주 형 변수의 존재를 추적하려고합니다.

실제로 나는 stringsAsFactors = FALSE으로 작업하는 것을 선호하지만 코드 이식성을 줄일 수 있기 때문에 많은 사람들이이를 싫어합니다. (TRUE이 기본값이므로 모든 스크립트를 options으로 호출하지 않는 한 다른 사람과 코드를 공유하는 것이 위험 할 수 있습니다.

subsetDrop <- function(...){ 
    droplevels(subset(...)) 
} 

제거하기 위해 보장되는 방식으로 데이터 프레임의 하위 집합을 추출하기 위해이 기능을 사용 : 특히 데이터 프레임에 대한

잠재적으로 더 편리한 솔루션의 subsetdroplevels 기능을 결합하는 것입니다 결과에서 사용되지 않은 모든 레벨.

+0

+1 설명해 주셔서 감사합니다. 내가 이해하지 못했던 이유는 ggplot이 존재하지 않는 레벨을 사용하는 이유였습니다. 그들은 자신의 이유가있을 수 있습니다.나는 R과 ggplot에서 완전한 초보자이므로 한시간 동안 무슨 일이 일어 났는지 이해하려고 애를 썼다. – Legend

+1

예를 들어 패 시팅 (faceting)과 같은 요인 수준의 처리 통계 세계에서 '정상'이지만, 대부분의 다른 사람들을 난처하게합니다. 근본적인 이유는 무엇인가가 빠진 경우 명시 적으로 누락 된 것을 보여주기를 원한다는 것입니다. 데이터가없는 패싯을 표시하여 – joran

2

이것은 정말 고통 스러웠습니다! ggplot이 제대로하지 않으면 엉망이됩니다. 그것이 의도 된 행동처럼

options(stringsAsFactors = FALSE) 

이 보이는하지만 불행히도 나는 다른 목적을 위해이 기능을 사용하도록 설정했고 그것은 내 모든 다른 스크립트에 대한 문제를 일으키는 시작 : 내 스크립트의 시작 부분에이 옵션을 사용하여 그것을 해결했다.

+0

이렇게하면 문제가 해결되지만 기본 전역 설정은 stringsAsFactors = TRUE입니다. data.frame (..., stringsAsFactors = FALSE)을 구성 할 때 이것을 인수로 전달할 수도 있습니다. 그러나 귀하의 예에서는 초기 '데이터'data.frame을 구축 할 때 완료되어야합니다. –