2014-10-22 17 views
0

도시의 무리가있는 파일 (지금까지 183 개)이 있는데 그 중 어떤 것도 카운티가 매핑되어 있지 않아 필요한 항목입니다. 범주 형 변수를 다시 코딩 할 때는 보통 plyr의 rename() 함수를 사용하지만이 모든 도시를 코드화하는 지저분한 불쾌한 코드를 작성하고 싶지는 않습니다. 나는 최근에 파이썬을 조금 배웠고,이 문제는 사전/해쉬 테이블 문제와 비슷하게 들렸다. 가능한 경우 프로그래밍 방식으로 좀 더 배우는 방법을 배우고 싶습니다.R의 150+ 범주 형 변수를 재 코딩

첫 번째 촬영에서 나는 한 열에 각 도시의 이름과 다른 도시에있는 각 카운티의 이름이있는 .csv를 만들었습니다. 나는이 파일을 내가 필요로하는 파일과 함께 사용하여 맵핑 할 수 있기를 희망했다. 나는 최소한의 코드를 보여주기 위해 무엇을 의미하는지 :

#key_file: 
LocalityName <- c('Addy', 'Burien', 'Newman Lake', 'Seattle', 'Tacoma') 
CountyName <- c('Stevens', 'King', 'Spokane', 'King', 'Pierce') 
key <- cbind.data.frame(LocalityName, CountyName) 

#real_file: 
LocalityName <- c('Seattle', 'Seattle', 'Tacoma', 'Seattle', 'Newman Lake') 
CountyName <- rep(NA, length(LocalityName)) 
Extra_Example_Col <- c('Y', 'Y', 'N', 'N', 'N') 
real <- cbind.data.frame(LocalityName, CountyName, Extra_Example_Col) 

나는 plyr에서()에 가입하여 시도하지만 (이 나를 따라 할 수있는 올바른 길인지 내 코드를 업데이트 할 수 있습니다 작업을 얻을 수 없었다, 확실하지 않다). sqldf 패키지에 대해서도 알고 있습니다.하지만 SQL을 처음 배우기 시작한 이래로이 유형이 조인인지 확실하지 않습니다. 내 두뇌는 이것을 "일대 다"유형의 매핑이라고 생각합니다.

나는 지금이 모든 다른 언어를 배우려고 노력하는 것이 나에게 약간 혼란 스럽지만, 시도하는 방법에 대한 아이디어를 나에게주고있다. 내 선호하는 솔루션은 R idiomatic이 될 것입니다.

답변

0

, 당신은 plyr에서 기본 R에서 merge, 또는 join를 사용할 수 있습니다. 동일한 열 두 데이터 세트에 존재하기 때문에 merge와 함께, 당신은 CountyName.xCountyName.y를 얻을

# Key_file: 
LocalityName <- c('Addy', 'Burien', 'Newman Lake', 'Seattle', 'Tacoma') 
CountyName <- c('Stevens', 'King', 'Spokane', 'King', 'Pierce') 
key <- cbind.data.frame(LocalityName, CountyName) 

# Real_file: 
LocalityName <- c('Seattle', 'Seattle', 'Tacoma', 'Seattle', 'Newman Lake') 
CountyName <- rep(NA, length(LocalityName)) 
Extra_Example_Col <- c('Y', 'Y', 'N', 'N', 'N') 
real <- cbind.data.frame(LocalityName, CountyName, Extra_Example_Col) 

# merge 
merge(real, key, by = "LocalityName") 
## LocalityName CountyName.x Extra_Example_Col CountyName.y 
## 1 Newman Lake   NA     N  Spokane 
## 2  Seattle   NA     Y   King 
## 3  Seattle   NA     Y   King 
## 4  Seattle   NA     N   King 
## 5  Tacoma   NA     N  Pierce 

# plyr::join 
join(real, key, by = "LocalityName") 
## LocalityName CountyName Extra_Example_Col CountyName 
## 1  Seattle   NA     Y  King 
## 2  Seattle   NA     Y  King 
## 3  Tacoma   NA     N  Pierce 
## 4  Seattle   NA     N  King 
## 5 Newman Lake   NA     N Spokane 

참고 : 예를 들면. join의 경우 CountyName이라는 두 개의 열이 있습니다. real data.frame에서 CountyName 열을 초기화하지 않으려합니다. 예를 들어 병합하기 전에 real <- cbind.data.frame(LocalityName, Extra_Example_Col) 또는 real[["CountyName"]] <- NULL으로 해당 열을 삭제하십시오.

+0

와우, 나는 그렇게 복잡했다. 나는 그 일을 합쳤지만, 내가 올바른 방법이 아니라고 생각하게 만들었습니다. 감사합니다 - 작은 버그를 알아 내려고 노력할 것입니다. – HFBrowning

+0

문제가 발생했을 때 함수에 대한 도움말 파일을 살펴 보는 것이 좋습니다 ('? join' 또는'? merge'). – ialm

3

매핑의 경우 merge을 사용할 수 있습니다. 예를 들어 : 내가 제대로 질문을 이해한다면

merge(real, key, by='LocalityName', all.x=TRUE) 
+0

최고로 간단합니다. +1 –

0
library(data.table) 

key <- as.data.table(key) 
real <- as.data.table(real) 

## If necessary, make sure your values are strings, not factors, etc 
key[, LocalityName := as.character(LocalityName)] 
real[, LocalityName := as.character(LocalityName)] 

## Set the keys, this is for joining. 
## not to be confused with your object named "key" 
setkey(key, LocalityName) 
setkey(real, LocalityName) 

## Ensure you have a character and not a logical 
key[, CountyName := as.character(CountyName)] 
real[, CountyName := as.character(CountyName)] 

## The i.X notation indicates to take the value 
## from the column inside the [brackets] 
real[key, CountyName := i.CountyName] 

real 
# LocalityName CountyName Extra_Example_Col 
# 1: Newman Lake Spokane     N 
# 2:  Seattle  King     Y 
# 3:  Seattle  King     Y 
# 4:  Seattle  King     N 
# 5:  Tacoma  Pierce     N