2014-09-22 4 views
0

droplevels 데이터 프레임 (이 질문을 중복으로 표시하지 마십시오. :)). 사용할 수있는 모든 방법이 주어지면 하나만 작동합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 예 :R 데이터 프레임 팩터

> df = data.frame(x = (c("a","b","c")),y=c("d","e","f")) 
> class(df$x) 
[1] "factor" 
> levels(df$x) 
[1] "a" "b" "c" 

방법 1 작동하지 : 작동하지

> df1 = droplevels(df) 
> class(df1$x) 
[1] "factor" 
> levels(df1$x) 
[1] "a" "b" "c" 

방법 2 : 작동하지

> df2 = as.data.frame(df, stringsAsFactors = FALSE) 
> class(df2$x) 
[1] "factor" 
> levels(df2$x) 
[1] "a" "b" "c" 

방법 3 : 4가 최종적으로 작동

> df3 = df 
> df3$x = factor(df3$x) 
> class(df3$x) 
[1] "factor" 
> levels(df3$x) 
[1] "a" "b" "c" 

방법 :

> df4 = df 
> df4$x = as.vector(df4$x) 
> class(df4$x) 
[1] "character" 
> levels(df4$x) 
NULL 

작동하는 동안 나는 방법 4가 가장 우아하지 않다고 생각합니다. 이 디버깅을 도와 줄 수 있습니까? 많은 감사

는 편집 : 다음의 의견과 답변 : 나는 데이터 프레임에서 요인 구조를 제거 할 만 droplevels

+4

그래서 당신이 원하는에'당신은 정말 당신이 요인 변수를 문자 가변적이고을 변환 할 의미 droplevels'. 그렇다면 방법 4만이 체계적으로 올바른 선택입니다. 'droplevels '는 한 요소에서 관찰되지 않은 레벨을 제거하지만, 테스트 케이스에서는 모든 레벨을 관찰하므로 아무 것도 삭제되지 않습니다. 처음에 인자가되기를 원하지 않는다면'df = data.frame (x = (c ""a ","b ","c ")), y = c ("d " "e", "f"), stringsAsFactors = FALSE)'. 방법 2는 이미 해당 시점의 요소이기 때문에 작동하지 않습니다. 당신의 목표는 정확히 * 무엇입니까? – MrFlick

+0

@ MrFlick, 설명을 주셔서 감사합니다. 그러나 여전히 이상하게도 방법 2가 작동하지 않습니다. – MasterJedi

+0

@YujiaHu 전혀 이상하지 않습니다. 'as.data.frame'을 전달하면 data.frame은 클래스 속성과 행 이름을 조정합니다. – joran

답변

4

"드랍 레벨"은 사용하지 않은 요소 레벨을 없애고 객체를 클래스 factor으로 유지하는 것을 의미합니다. 당신은 문자 컬럼에 모든 요소 열을 변환하는 방법을 찾고 : 당신이 말할 때

> df2 = data.frame(lapply(df, 
      function(x) if (is.factor(x)) as.character(x) else x), 
       stringsAsFactors = FALSE) 
> lapply(df2, class) 
$x 
[1] "character" 

$y 
[1] "character" 

> df2 
    x y 
1 a d 
2 b e 
3 c f 
4

내가 당신을 추측하고있어하지 원하는 :

df[] <- lapply(df, as.character) 

이 두 가지 차이점이있다 코드에서 : df의 데이터 프레임 구조를 보존하고 할당 된 코드의 왼쪽에있는 [[]]와 lapply을 사용하십시오. droplevels 함수는 관계없는 수준 만 삭제하지만 문자 벡터로 변환하지 않습니다. as.character 함수에는 data.frame 메서드가 없습니다. 요인 벡터 목록보다는 각 요인 벡터에 적용해야합니다. 당신은 당신이 lapply 결과 주위 data.frame을 포장해야 할 '안양'을 대체 파괴적하지 않으려면

makefac2char <- function(v) if(is.factor(v)){as.character(v)} else {v} 
df[] <- lapply(df, makefac2char) 
# To make a new dataframe 
df2 <- lapply(df, makefac2char) 
df2<- data.frame(df2) 

: 더 일반적인 기능이 될 것이다 (숫자 벡터에 강제 시도의 오류를 피할 수) 그렇게하기 lapply은 속성을 유지 관리하지 않기 때문에 'stringAsFactors = FALSE'(또는 해당 옵션을 .Options에 설정)로 해당 데이터 프레임을 만든 경우 data.frame 전체에서이 작업을 수행 할 필요가 없습니다.

+1

표준'droplevels()'는 data.frame'df = data.frame (x = factor (c ("a", "b", "c"), levels = letters), y = c ("d", "e", "f"), z = 1 : 3); 물방울 (df)'. 이것이 무엇을 달성하는지 확실하지 않습니다. – MrFlick

+0

'droplevels'에는 data.frame 메소드가 있습니다. – joran

+0

죄송합니다. 질문자는 '물방울'의 작용에 대해 혼란 스럽습니다. 그가 원하는 것을 제공하기 위해 편집되었지만 달성하기 위해 잘못된 기능을 사용하고 있습니다. 그는 as.character를 원한다. –