在 R 中按名称加入两个不同的数据库

Join two different databases by name in R

我是 R 的新手,我需要通过老师的名字加入两个不同的数据库,所以我知道数据库 1 中的老师存在于数据库 2 中。我需要通过他们的姓氏加入他们+ 他们名字的第一个字母。

第一个数据库看起来像这样:

    NAME            ID
JOSE SANTOS         2
MARIA RIOS          3
JULIANA SILVA       7

第二个看起来像这样:

         NAME                      GENDER
TIAGO MELO                         MALE
JOSE FRAGOSO SANTOS                MALE
JULIANA DOS SANTOS SILVA           FEMALE
MARIANA ALMEIDA                    FEMALE

所以,我需要通过名字知道数据库 1 中的人是否在数据库 2 中。所以它看起来像这样:

         NAME                   GENDER         PRESENT
TIAGO MELO                       MALE             NA
JOSE FRAGOSO SANTOS              MALE             YES
JULIANA DOS SANTOS SILVA        FEMALE            YES
MARIANA ALMEIDA                 FEMALE            NA

我已经试过合并了,但是好像不行。

谢谢!

我们可以使用 dplyr 包中的 mutate,假设您的第一个数据帧是 df1,第二个是 df2

library(dplyr)

df2=mutate(df2,"PRESENT"=ifelse(df2$NAME %in% df1$NAME,"YES",NA))

一般来说,我认为最简单的方法是预先提取名字的首字母和姓氏,然后使用简单的 merge/join 机制。

基础 R

df1$quux <- gsub("^(.).* ([^ ]*) *$", "\1 \2", df1$NAME)
df2$quux <- gsub("^(.).* ([^ ]*) *$", "\1 \2", df2$NAME)
df1
#            NAME ID     quux
# 1   JOSE SANTOS  2 J SANTOS
# 2    MARIA RIOS  3   M RIOS
# 3 JULIANA SILVA  7  J SILVA
df2
#                       NAME GENDER      quux
# 1               TIAGO MELO   MALE    T MELO
# 2      JOSE FRAGOSO SANTOS   MALE  J SANTOS
# 3 JULIANA DOS SANTOS SILVA FEMALE   J SILVA
# 4          MARIANA ALMEIDA FEMALE M ALMEIDA

从这里开始,

merge(df1, df2, by = "quux", all.y = TRUE)
#        quux        NAME.x ID                   NAME.y GENDER
# 1  J SANTOS   JOSE SANTOS  2      JOSE FRAGOSO SANTOS   MALE
# 2   J SILVA JULIANA SILVA  7 JULIANA DOS SANTOS SILVA FEMALE
# 3 M ALMEIDA          <NA> NA          MARIANA ALMEIDA FEMALE
# 4    T MELO          <NA> NA               TIAGO MELO   MALE

你可以用!is.na(ID)来确定PRESENT

dplyr

library(dplyr)
left_join(
  mutate(df2, quux = gsub("^(.).* ([^ ]*) *$", "\1 \2", NAME)),
  mutate(df1, quux = gsub("^(.).* ([^ ]*) *$", "\1 \2", NAME)),
  by = "quux"
) %>%
  mutate(PRESENT = !is.na(ID))
#                     NAME.x GENDER      quux        NAME.y ID PRESENT
# 1               TIAGO MELO   MALE    T MELO          <NA> NA   FALSE
# 2      JOSE FRAGOSO SANTOS   MALE  J SANTOS   JOSE SANTOS  2    TRUE
# 3 JULIANA DOS SANTOS SILVA FEMALE   J SILVA JULIANA SILVA  7    TRUE
# 4          MARIANA ALMEIDA FEMALE M ALMEIDA          <NA> NA   FALSE