在 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
我是 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