2014-10-22 5 views
0

У меня есть файлы с кучей городов (до сих пор 183), и ни один из них не имеет графств, сопоставленных с ними, что мне нужно. Для перекодировки категориальных переменных я обычно использую функцию rename() plyr, но я не хочу писать грязную неприятную часть кода, чтобы перекодировать все эти города. В последнее время я изучал немного питона, и эта проблема немного напоминала проблему словаря/хеш-таблицы. Я хотел бы научиться делать что-то более программное, если это возможно.Перекодирование 150 + категориальных переменных в R

В качестве первого снимка я пошел вперед и создал .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 впервые и не уверен, что это тип соединения? Мой мозг думает об этом как о «одно-много» картировании.

Я думаю, что пытаться изучить все эти другие языки прямо сейчас меня немного сбивает с толку, но это дает мне некоторые идеи о том, как пробовать вещи. Мое предпочтительное решение было бы идиоматичным.

ответ

0

Если я правильно понимаю ваш вопрос, вы можете использовать merge из базового R или join из plyr. Например:

# 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 

Обратите внимание, что с merge, вы получаете CountyName.x и CountyName.y, потому что тот же столбец существует в обоих наборах данных. С join у вас есть две колонки по имени CountyName. Вероятно, вы не хотите инициализировать столбец CountyName в файле данных real. Например, у меня есть 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 

 Смежные вопросы

  • Нет связанных вопросов^_^