我有两个嵌套框df.old
和df.new
。现在,我想将df.old
嵌套框中的PID变量添加到新的嵌套框中,在新的嵌套框中匹配电子邮件地址。如果没有可用的电子邮件地址,则应使用名和姓(paste(firstname, lastname)
)进行匹配。如何有效地完成此操作?
我的第一个猜测是创建两个“查找”函数get_PID_by_mail(mail)
和get_PID_by_name(firstname, lastname)
,将它们向量化并应用于df.new %>% mutate(PID=get_PID_by_mail(mail))
。但结果证明这有点效率低下,因为数组很大。你会如何解决这个问题?谢谢!
df.old <- data.frame(PID = c(1, 2, 3, 4, NA),
firstname = c("", "Peter", "David", "Jessy", ""),
lastname = c("", "White", "Smith", "Connor", ""),
mail = c("[email protected]", "[email protected]", NA, "[email protected]", NA))
df.new <- data.frame(mail = c("[email protected]", "[email protected]", NA, NA , NA),
firstname = c("", "", "", "David", ""),
lastname = c("", "", "", "Smith", ""))
df.new
字符串
预期产出:
df.new
======
mail firstname lastname PID
1 [email protected] 1
2 [email protected] 2
3 <NA> <NA>
4 <NA> David Smith 3
5 <NA> <NA>
型
2条答案
按热度按时间pexxcrt21#
使用两个
left_join
,您可以:字符串
rsl1atfo2#
在另一个答案之后一分钟,但是用
bind_rows
来做:字符串
编辑-跳过不良邮件
对电子邮件进行更强大检查的最简单方法是使用正则表达式来测试第一个匹配的电子邮件有效性,并在第二个匹配中否定它(并检测NA),然后加入结果:
型
这里的坏先生电子邮件无法通过电子邮件匹配(因为它不是一个有效的电子邮件地址),所以它被跳过,他的名字匹配。戈登·贝内特先生已经改变了他的电子邮件,所以他的新的没有找到,他的名字匹配。最后,大卫有一个空字符串作为电子邮件(
""
),所以他被跳过并按名字匹配。没有名字,电子邮件或PID的不可见人被保留在指定的新的字符串中。