Соответствие и замена строки dplyr на основе таблицы поиска в R - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь выполнить функцию, которую ранее выполнял в Excel, но не могу найти средства для ее достижения.

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

People <- data.frame(
  Fname = c("Tom","Tom","Jerry","Ben","Rod","John","Perry","Rod"),
  Sname = c("Harper","Kingston","Ribery","Ghazali","Baker","Falcon","Jefferson","Lombardy")
)

Lookup <- data.frame(
  Fname = c("Tom","Tom","Rod","Rod"),
  Sname = c("Harper","Kingston","Baker","Lombardy"),
  NewFname = c("Tommy","Tim","Roderick","Robert")
)

Что я хочу сделать, это заменить Fname на NewFname, в зависимости от двух условий: что Fname иСоответствие имени в обоих таймфреймах.Это потому, что у меня есть набор данных с другими 40000 строк данных, которые должны быть обработаны.В конечном итоге, я надеюсь получить следующий фрейм данных:

People <- data.frame(
  Fname = c("Tommy","Tim","Jerry","Ben","Roderick","John","Perry","Robert"),
  Sname = c("Harper","Kingston","Ribery","Ghazali","Baker","Falcon","Jefferson","Lombardy")
)

Однако мне нужно функциональное решение, поэтому мне не нужно вручную вводить условия и имена замены по отдельности.До сих пор у меня есть следующее (проблемное) решение, которое включает генерацию нового столбца с использованием mutate в dplyr, но он не работает

 People %>%
  mutate(NewName = if_else(
    Fname == Lookup$Fname & Sname == Lookup$Sname, NewFname, Fname
  ))

1 Ответ

0 голосов
/ 19 октября 2018

Просто используйте left_join, а затем mutate на !is.na()

library(dplyr)
People %>% 
  left_join(Lookup, by = c("Fname", "Sname")) %>% 
  mutate(Fname = ifelse(!is.na(NewFname), NewFname, Fname))
# Fname     Sname       NewFname
# 1    Tommy    Harper    Tommy
# 2      Tim  Kingston      Tim
# 3    Jerry    Ribery     <NA>
# 4      Ben   Ghazali     <NA>
# 5 Roderick     Baker Roderick
# 6     John    Falcon     <NA>
# 7    Perry Jefferson     <NA>
# 8   Robert  Lombardy   Robert

Я оставил NewFname просто чтобы прояснить, что происходит.

Данные:

People <- data.frame(
  Fname = c("Tom","Tom","Jerry","Ben","Rod","John","Perry","Rod"),
  Sname = c("Harper","Kingston","Ribery","Ghazali","Baker","Falcon","Jefferson","Lombardy"), stringsAsFactors = F
)

Lookup <- data.frame(
  Fname = c("Tom","Tom","Rod","Rod"),
  Sname = c("Harper","Kingston","Baker","Lombardy"),
  NewFname = c("Tommy","Tim","Roderick","Robert"), stringsAsFactors = F
)
...