2017-10-19 14 views
0

이 질문은 아주 기본적인 질문이지만 이해가 안됩니다.R의 레벨은 무엇입니까?

참고로 간단한 스크립트를 사용하여 CSV 테이블을 읽고 필드 중 하나를 필터링하여 이것을 전달합니다. 새로운 변수에 추가하고 첫 번째 변수에 할당 된 메모리를 지 웁니다. 필자가 필터링 한 필드에서 unique()을 호출하면 결과가 실제로 필터링되었음을 알 수 있지만 원래 데이터 집합에있는 데이터에 해당하는 '레벨'을 나타내는 추가 행이 하나 있습니다.

예 :

df = read.csv(path, sep=",", header=TRUE) 
df_intrate = df[df$AssetClass == "ASSET CLASS A", ] 

rm(df) 
gc() 

unique(df_intrate$AssetClass) 

결과 :

[1] ASSET CLASS A 
Levels: ASSET CLASS E ASSET CLASS D ASSET CLASS C ASSET CLASS B ASSET CLASS A 

df에서 구조 정보는 어떻게 든 그 df_intrate을 보여주는 R 스튜디오에도 불구하고 df_intrate에 보존되어 ASSET CLASS A에 대한 행 실제로 예상 번호는?

+0

'read.csv (path, as.is = TRUE) '를 사용하면 인자 열 대신 문자 열을 얻을 수 있습니다. 또한'header = TRUE'와'sep = ","''read.csv'가 기본값이므로 지정할 필요가 없습니다. –

답변

1

factor이라는 R의 데이터 구조에 Levels이 표시됩니다. 요소는 정수 유형입니다.

typeof(as.factor(letters)) 
#[1] "integer" 

그러나 각 정수에는 문자 사양 (레이블)을 매핑하는 레이블이 있습니다. 알고리즘은 숫자 (때로는 더미 변수의 형태로)를 필요로하지만 모델의 해석 중에 사람에게 더 적합한 레이블을 유지하는 모델에서 일반적으로 도움이되는 요소를 볼 수 있습니다.

attributes(as.factor(letters)) 
#$levels 
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" 
#[18] "r" "s" "t" "u" "v" "w" "x" "y" "z" 

#$class 
#[1] "factor" 

ASSET CLASS A에 열을 부분 집합 일단 컬럼의 속성뿐만 아니라 전송받을 것을 의미합니다 :

레벨은 벡터의 속성입니다. 이것은 여전히 ​​벡터의 길이와 관련이 없습니다. 그래도 여전히 [1]입니다.

1

R은 character 클래스 및 factor 클래스를 갖는다. character은 기본 문자열 데이터 구조입니다. factor은 통계에 중요한 요소입니다. 예를 들어, 사람들이 귓볼의 연결성 (중요하지만 흔히 간과 한 구별)으로 나뉘는 데이터 세트가있을 수 있습니다. 이 경우 각 사용자의 값은 connected 또는 free입니다. 예를 들어, 귓볼 연결 상태의 함수로 지능을 모델링하려면 connected 또는 free의 두 클래스가 있다는 것을 모델에서 이해해야하므로이 값을 factor 벡터로 나타낼 수 있습니다. 그 벡터는 두 개의 levels : connectedfree을 가질 것입니다. 수준이

구문 적으로는, factorcharacter 변수는 다르게 as.integer에 응답 R.의 일이 왜 그래서 의미입니다. factor 변수는 해당 레벨에 해당하는 숫자로 변환되지만 character 변수는 기존 atoi처럼 더 변환됩니다. 일반적으로 factor 변수를 가지고 작업 할 경우 많은 문제가 발생할 수 있습니다. character입니다.

대부분의 경우 CSV 파일을 읽을 때 factors보다 character 값이 더 많으므로 보통 read.csv(..., stringsAsFactor=FALSE)으로 설정합니다. (이것이 당신의 일반적인 취향인지 여부에 관한 YMMV.)

2

df_intrate가 실제로 애셋 클래스 A의 예상 행 수인 것으로 나타 났음에도 불구하고 df_intrate에 구조 정보가 그대로 유지됩니까?

예. 이것은, 요인라는 R에 저장하는 방법 범주 변수입니다 - 모두 수준, 가능한 모든 값의 벡터와 촬영 한 실제 값, 저장됩니다 : 당신은 제거 할 수

x = factor(c('a', 'b', 'c', 'a', 'b', 'b')) 
x 
# [1] a b c a b b 
# Levels: a b c 

y = x[1] 
# [1] a 
# Levels: a b c 

droplevels(y) 
# [1] a 
# Levels: a 

factor(y) 
# [1] a 
# Levels: a 

당신은 모든 요소 컬럼에서 사용되지 않는 모든 수준을 떨어 데이터 프레임에 droplevels를 사용할 수 있습니다 droplevels(), 또는 존재하는 것만에서 새로운 요소를 창조하는 factor 기능을 다시 적용하여 사용되지 않는 수준 :


현재의 문제와 관련이없는, 우리는 또한 factor는 요인의 수준과 그들이 가야하는 순서를 지정하는 데 사용할 수있는 선택적 levels 인수를 가지고 언급해야하지만

dat = data.frame(x = x) 
str(dat) 
# 'data.frame': 6 obs. of 1 variable: 
# $ x: Factor w/ 3 levels "a","b","c": 1 2 3 1 2 2 

str(dat[1, ]) 
# Factor w/ 3 levels "a","b","c": 1 

str(droplevels(dat[1, ])) 
# Factor w/ 1 level "a": 1 

. 이는 특정 순서 (음모 또는 모델링)를 원하거나 실제로 존재하는 레벨보다 가능한 레벨이 있고이를 포함하고자하는 경우 유용 할 수 있습니다. levels을 지정하지 않으면 기본값이 알파벳 순서로 지정됩니다.

x = c("agree", "disagree", "agree", "neutral", "strongly agree") 
factor(x) 
# [1] agree   disagree  agree   neutral  strongly agree 
# Levels: agree disagree neutral strongly agree 
## not a good order 

factor(x, levels = c("disagree", "neutral", "agree", "strongly agree")) 
# [1] agree   disagree  agree   neutral  strongly agree 
# Levels: disagree neutral agree strongly agree 
## better order 

factor(x, levels = c("strongly disagree", "disagree", "neutral", "agree", "strongly agree")) 
# [1] agree   disagree  agree   neutral  strongly agree 
# Levels: strongly disagree disagree neutral agree strongly agree 
## good order, more levels than are actually present 

당신은 ?reorder?relevel (또는 factor 다시는) 이미 생성 된 요소에 대한 수준의 순서를 변경하는 데 사용할 수 있습니다.