【问题标题】:dplyr string match and replace based on lookup table in Rdplyr 字符串匹配和替换基于 R 中的查找表
【发布时间】:2018-10-19 10:11:11
【问题描述】:

我正在尝试实现以前在 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")
)

我想要做的是用 NewFname 替换 Fname,这取决于两个条件:两个数据帧中的 Fname 和 Sname 匹配。这是因为我有一个数据集,其中包含需要处理的其他 40,000 行数据。最终,我希望最终得到以下数据框:

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

但是,我想要一个函数解决方案,这样我就不必单独手动输入条件和替换名称。到目前为止,我有以下(有问题的)解决方案,这将涉及在 dplyr 中使用 mutate 生成一个新列,但它不起作用

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

【问题讨论】:

  • merge(People, Lookup, all.x = TRUE)

标签: r dplyr str-replace


【解决方案1】:

只需使用left_join,然后在!is.na() 上使用mutate

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
)

【讨论】:

  • 谢谢,真的很有帮助!如此简单,却为我节省了几个小时 :)
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多