MapR中两个 Dataframe 的列

b5buobof  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(138)

我有两个 Dataframe 和几个列,但为了简单起见,让我们说我的两个 Dataframe 如下:

## Dataframe #1
df1 <- data.frame(name = c("Jake", "Paul", "Luis", "Leon"),
                 salary_new = c(60, 80, 90, 50))

## Dataframe #2
df2 <- data.frame(name = c("Paul Henderson", "John F. Smith", "Leon K.", "Luis Sierra"),
                         salary_old = c(60, 55, 60, 80))

我想在两个name列之间进行某种Map,将DF1中的名称替换为DF2中的名称,以生成以下结果:

df3 <- data.frame(name = c("Jake", "Paul Henderson", "Luis Sierra", "Leon K."),
                  salary_new = c(60, 80, 90, 50))

我遇到的问题是,每个 Dataframe 都有不属于另一个的名称,而属于另一个的名称则略有不同(包括姓氏、中间名首字母)。是否有办法进行排序的模糊匹配,以获得所需的输出,并使DF2中不存在的名称与DF1中出现的名称相同?

jdgnovmf

jdgnovmf1#

我们可以提取第一个单词并进行连接

library(dplyr)
library(stringr)
df2 %>%
   mutate(name2 =word(name, 1)) %>%
   left_join(df1, ., by = c("name" = "name2")) %>%
   transmute(name = coalesce( name.y, name), salary_new)
  • 输出
name salary_new
1           Jake         60
2 Paul Henderson         80
3    Luis Sierra         90
4        Leon K.         50
ulmd4ohb

ulmd4ohb2#

要进行匹配,可以将fuzzyjoinstringr::str_detect一起使用,然后选择要保留name.xname.y中的哪一个,在这里,我保留字符串最长的名称,即which.maxnchar

library(fuzzyjoin)
library(dplyr)
fuzzy_right_join(df2, df1, match_fun = stringr::str_detect) %>% 
  mutate(name = apply(across(contains("name")), 1, \(x) x[which.max(nchar(x))])) %>% 
  select(name, salary_new)

#             name salary_new
# 1           Jake         60
# 2 Paul Henderson         80
# 3    Luis Sierra         90
# 4        Leon K.         50

相关问题