2014-02-27 2 views
1

열에 요인을 포함하는 데이터 프레임을 읽은 것으로 가정합니다. 요소를 숫자로 변환하고 싶습니다만 의 특정 매핑을 사용합니다. 이 변환은 일반적으로 이후 계산을위한 선행 단계입니다. 예를 들면 다음과 같습니다 car90 $ 유형 열에서R - 특정 매핑을 사용하는 숫자로 변하는 요인

> library(rpart) 

> head(car90["Type"]) 
       Type 
Acura Integra Small 
Acura Legend Medium 
Audi 100  Medium 
Audi 80  Compact 
BMW 325i  Compact 
BMW 535i  Medium 

> summary(car90$Type) 
Compact Large Medium Small Sporty  Van NA's 
    19  7  26  22  21  10  6 

, 나는, -1이 될 '대형', '중간'0으로 -10로 '컴팩트'를 설정하려는, '소형'이 될 수 있습니다 1, 'Sporty'는 10, 'Van'은 20이됩니다. 숫자는 숫자가 아닌 숫자입니다. 내가 어떻게 그럴 수 있니?

관련 질문을 이미 살펴 보았지만 해결책을 찾지 못했습니다.

Replace specific column "words" into number or blank

Changing column names of a data frame in R

Replace contents of factor column in R dataframe

Convert factor to integer

답변

1

난 그냥 벡터 첨자를 사용합니다; 여기 예입니다 :

R>a <- as.factor(c("C", "L", "M", "L", "C")) 
R>a 
[1] C L M L C 
Levels: C L M 
R>b <- c(C=-10,L=-1,M=0) 
R>b 
    C L M 
-10 -1 0 
R> 
R>b[a] 
    C L M L C 
-10 -1 0 -1 -10 
R> 
1

당신은 당신의 사건은이

x <- c('Compact', 'Large', 'Medium', 'Small', 'Sporty', 'Van') 
y <- factor(x, levels = c('Compact', 'Large', 'Medium', 'Small', 'Sporty', 'Van'), 
    labels = c(-10, -1, 0, 1, 10, 20)) 
as.numeric(as.character(y)) 


[1] -10 -1 0 1 10 20 

을 시도 할 수 있습니다, 당신은 호출 할 수

car90$Type <- factor(car90$Type, levels = c('Compact', 'Large', 'Medium', 'Small', 'Sporty', 'Van'), 
    labels = c(-10, -1, 0, 1, 10, 20)) 
car90$Type <- as.numeric(as.character(car90$Type)) 
+0

난 여전히 데이터 프레임에 다시 저장해야 , 권리? 나는'car90 $ Type <- as.numeric (as.character (y))'를 할 것인가? – stackoverflowuser2010

+0

나는 예제를 보여주고 나의 대답을 편집한다. – Bangyou

+0

감사합니다. 그러나 car90 $ Type은 이미 하나의 요소입니다. car90 $ Type을 새로운 요소로 설정하는 대신 첫 번째 단계에서 레이블을 지정하는 방법이 있습니까? – stackoverflowuser2010

0

을이이 작업을

encode <- data.frame(Type = c("Compact", "Large", "Medium", "Small", "Sporty", "Van"), TypeValue = c(-10,-1,0,1,10,20)) 

car90 <- merge(car90, encode, all.x = TRUE) 

# or using dplyr 
library(dplyr) 
car90 <- left_join(car90, encode) 
0

사용을 조인 다음 예제와 같이 merge()를 호출하십시오.

먼저 원하는 값으로 데이터 프레임을 만듭니다. 이 시나리오에서는 다음을 작성하십시오.

dictionary <- data.frame(Type = c('Compact', 'Large', 'Medium', 'Small', 'Sporty', 'Van'), 
        Values = c(-10, -1, 0, 1, 10, 20)) 

output <- merge(car90$Type, dictionary) 

중요 :이 예에서는 NA를 고려하지 않았습니다. 그것들에 가치를 부여하고 싶다면, 그 값을 가진 타입으로 그것을 포함시켜야 할 것입니다. 그렇지 않으면 해당 행이 출력의 일부가되지 않습니다.

결과 데이터 프레임은 원하는대로 포맷됩니다.

참고 : 열의 이름이 완전히 동일하면 더 쉽지만 by.x 및 by.y와 함께 사용할 열을 정의하면 더 자세한 내용을 확인할 수 있습니다.

0

그냥 수준을 재설정 :

levels(car90$Type) <- c(-10, -1, 0, 1, 10, 20) 

(당신 같은 머리/집합)에 리드 :이에 계산하려는 경우

#    Type 
# Acura Integra 1 
# Acura Legend  0 
# Audi 100   0 
# Audi 80  -10 
# BMW 325i  -10 
# BMW 535i   0 

있지만, 조심을 수행해야 다음 as.numeric(levels(fac))[fac]을 사용하여 근본적인 요인 정수 값이 아닌 숫자를 계산하도록하십시오.

1

@NealFultz 노트에서 벡터 첨자를 사용하면이 효과를 얻을 수 있습니다.vals의 순서가 요인 xlevels과 동일로

vals <- c(Compact=-10,Large=-1,Medium=0,Small=1,Sporty=10,Van=20) 
vals[x] 

올바른 결과를 줄 것이다 :

x <- car90$Type[1:10] 
#[1] Small Medium Medium Compact Compact Medium Medium Large Large <NA> 
#Levels: Compact Large Medium Small Sporty Van 

즉 : 당신이 비록이 작업을 수행하는 방법에 불구하고 하나는주의해야합니다 : 당신이 vals 순서를 변경하는 경우

vals[x] 
# Small Medium Medium Compact Compact Medium Medium Large Large <NA> 
#  1  0  0  -10  -10  0  0  -1  -1  NA 

이 넘어 질 것입니다 예 :

vals <- c(Large=-1,Compact=-10,Medium=0,Small=1,Sporty=10,Van=20) 
vals[x] 
# Small Medium Medium Large Large Medium Medium Compact Compact <NA> 
#  1  0  0  -1  -1  0  0  -10  -10  NA 

당신처럼, 오히려 순서보다 namesvals의에 x의 문자 표현을 비교를 기반으로 서브 세트에 의해이 문제를 가져올 수 있습니다

vals <- c(Large=-1,Compact=-10,Medium=0,Small=1,Sporty=10,Van=20) 
vals[as.character(x)] 
# Small Medium Medium Compact Compact Medium Medium Large Large <NA> 
#  1  0  0  -10  -10  0  0  -1  -1  NA