2016-04-19 2 views
0

У меня есть таблица, которая использует уникальные идентификаторы, но несовместимые читаемые имена для этих идентификаторов. Это гораздо сложнее, чем названия месяцев, но ради более простого примера, скажем, это выглядит примерно так:Как обновить данные из неполной таблицы поиска?

demo_frame <- read.table(text=" Month_id Month_name Number 
1 Jan 37 
2 Feb 63 
3 March 9 
3 Mar 150 
2 February 49", header=TRUE) 

исключением того, что они, возможно, написано «Фев» или «марта» восемь различных способов. У меня также есть чистый кадр данных, содержащий согласованные имена для имен, которые имеют вариации:

month_lookup <- read.table(text=" Month_id Month_name 
2 Feb 
3 Mar", header=TRUE) 

Я хочу, чтобы добраться до этого:

1 Jan 37 
2 Feb 63 
3 Mar 9 
3 Mar 150 
2 Feb 49" 

Я попытался merge(month_lookup, demo_frame, by = "Month_id") но отбросил все значения января, потому что «Ян» не существует в таблице поиска:

Month_id Month_name.x Month_name.y Number 
1  2   Feb   Feb  63 
2  2   Feb  February  49 
3  3   Mar  March  9 
4  3   Mar   Mar 150 

Мое чтением из How to replace data.frame column names with string in corresponding lookup table in R является то, что я должен быть в состоянии использовать plyr::mapvalues но я дядя ar из примеров и документации о том, как я сопоставил id с name. Я не просто хочу сказать «Заменить« Март »на« Мар »- мне нужно сказать SET month_name = 'Mar' WHERE month_id = 3 для каждого значения в поиске.

+0

Почему бы просто не объединить две таблицы вместе? – bramtayl

+0

Извините. Должно быть включено, где 'merge' не удалось. Исправлена. – Amanda

+0

Просто добавьте Jan в таблицу поиска? Таблицу поиска легко сгенерировать с помощью 'data.frame (month.abb = month.abb, Month_id = 1:12)' – bramtayl

ответ

0

Я думаю, что вы хотите этого.

library(dplyr) 

demo_frame <- read.table(text=" Month_id Month_name Number 
1 Jan 37 
2 Feb 63 
3 March 9 
3 Mar 150 
2 February 49", header=TRUE, stringsAsFactors = FALSE) 

month_lookup <- read.table(text=" Month_id Month_name 
2 Feb 
3 Mar", header=TRUE, stringsAsFactors = FALSE) 

result = 
    demo_frame %>% 
    rename(bad_month = Month_name) %>% 
    left_join(month_lookup) %>% 
    mutate(month_fix = 
      Month_name %>% 
      is.na %>% 
      ifelse(bad_month, Month_name)) 
Смежные вопросы