요인 수준과 요인 레이블 간의 혼동


106

R에서 요인의 수준과 레이블간에 차이가있는 것 같습니다. 지금까지 저는 항상 수준이 요인 수준의 '실제'이름이고 레이블이 출력에 사용되는 이름이라고 생각했습니다 (예 : 표 및 그림). . 다음 예에서 볼 수 있듯이 분명히 이것은 사실이 아닙니다.

df <- data.frame(v=c(1,2,3),f=c('a','b','c'))
str(df)
'data.frame':   3 obs. of  2 variables:
 $ v: num  1 2 3
 $ f: Factor w/ 3 levels "a","b","c": 1 2 3

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
levels(df$f)
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

스크립팅 할 때 레벨 ( 'a', 'b', 'c')에 여전히 액세스 할 수 있다고 생각했지만 작동하지 않습니다.

> df$f=='a'
[1] FALSE FALSE FALSE

그러나 이것은 다음을 수행합니다.

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE

그래서 내 질문은 두 부분으로 구성됩니다.

  • 레벨과 레이블의 차이점은 무엇입니까?

  • 스크립팅 및 출력을위한 요인 수준에 대해 다른 이름을 가질 수 있습니까?

배경 : 긴 스크립트의 경우 요소 수준이 짧은 스크립트가 훨씬 쉬워 보입니다. 그러나 보고서 및 그림의 경우이 짧은 요인 수준은 적절하지 않을 수 있으며 더 정확한 이름으로 대체해야합니다.

답변:


131

매우 짧음 : 레벨은 입력이고 레이블은 factor()함수 의 출력입니다 . 요소에는 함수 levellabels인수로 설정되는 속성 만 factor()있습니다. 이것은 SPSS와 같은 통계 패키지의 레이블 개념과 다르며 처음에는 혼란 스러울 수 있습니다.

이 코드 줄에서 수행하는 작업

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))

R에게 벡터가 있음을 알려줍니다. df$f

  • 요인으로 변환하려는
  • 서로 다른 수준이 a, b 및 c로 코딩되는 경우
  • 레벨을 치료 A 등으로 표시하려는 경우

factor 함수는 a, b, c 값을 찾아 수치 적 요인 분류로 변환 한 다음 라벨 값을 level요인 의 속성에 추가합니다 . 이 속성은 내부 숫자 값을 올바른 레이블로 변환하는 데 사용됩니다. 그러나 보시다시피 label속성 이 없습니다 .

> df <- data.frame(v=c(1,2,3),f=c('a','b','c'))    
> attributes(df$f)
$levels
[1] "a" "b" "c"

$class
[1] "factor"

> df$f <- factor(df$f, levels=c('a','b','c'),
+   labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))    
> attributes(df$f)
$levels
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

$class
[1] "factor"

1
빠른 답변에 감사드립니다! 이제 레벨과 레이블의 목적을 이해 한 것 같습니다. 테이블 이름과 플롯 범례를 수동으로 편집하지 않고도 인간이 더 잘 읽을 수 있도록 출력을 만들기위한 제안이 있습니까?
donodarazao

6
나는 종종 레이블을 플로팅 / 만들기 직전에 레벨을 변환합니다. 예를 들어 조작하는 동안 레벨을 "a", "b", "c"로 유지 한 다음 levels (f) <-paste ( "Treatment", toupper (levels ( f)), sep = "") 플로팅 할 때 [또는 무언가]. 또는 휴대하고 출력에만 사용하는 병렬 계수 f_pretty를 생성합니다.
Ben Bolker 2011 년

둘 다 생각했지만 두 방법 모두 단점이 있습니다. 첫 번째는 막대한 수의 그래프를 그릴 때 지루해질 수 있고 두 번째는 스크립팅에 많은 데이터 집계가 관련 될 때 지루해질 수 있습니다. 그러나 분명히 쉽게 피할 수있는 방법이 없으므로 귀하의 제안을 따르겠습니다. :)
donodarazao 2011 년

@ 42- "숫자 값"이 무엇을 의미하는지 잘 모르겠습니다. 요소의 내부 값을 의미한다면 위에서 말한 것입니다. 따라서 내부 수치 가 언급 됩니다. levels인수 를 지정하는 경우 인수와 일치해야하는 입력 값을 제공합니다 labels. R은 레이블을 유지하고 (속성으로 levels혼동이 있음) 내부적으로 정수 코드를 저장합니다. 이 정수 코드는 유형이 무엇이든 원래 값과 관련이 없습니다. 당신이 나를 오해했다고 생각합니다.
Joris Meys

사과. 당신이 쓴 것은 나의 이해이기도했고, 이제 나는 당신의 질문을 다시 읽고 있으므로 당신이 다르게 말한 곳을 볼 수 없습니다. 아무것도 추가하지 않기 때문에 댓글을 삭제하겠습니다.
IRTFM

17

레벨이나 레이블을 참조 할 수있는 "lfactors"패키지를 작성했습니다.

# packages
install.packages("lfactors")
require(lfactors)

flips <- lfactor(c(0,1,1,0,0,1), levels=0:1, labels=c("Tails", "Heads"))
# Tails can now be referred to as, "Tails" or 0
# These two lines return the same result
flips == "Tails"
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE
flips == 0 
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

lfactor는 레벨이 레이블과 혼동되지 않도록 숫자 여야합니다.


3
이것은 좋은 패키지이며 그것에 대해 게시하고 작성해 주셔서 감사합니다. R 팩터에 고유해야하는 일종의 기능인 것 같습니다. 내장 된 동등성 검사와 함께 이러한 종류의 이름-값 쌍 매핑을 제공하는 패키지를 보면 좋습니다.
Soren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.