gpt4 book ai didi

regex - R:跨两个数据帧的名字和姓氏组合(即两列)的不区分大小写匹配

转载 作者:行者123 更新时间:2023-12-01 05:08:16 24 4
gpt4 key购买 nike

在 R 中,我想提取完成了我设计的两个版本的测试并随后分两个阶段进行管理的人(我要求参与者提供他们的名字和姓氏)。

问题是 1. 人们在使用大写字母方面并不一致; 2. 有些人可能与其他人共享名字或姓氏。因此, 1. 我需要一个不区分大小写的搜索; 2.我想提取一个新的数据框,列出第一个版本的名字和姓氏,以及第二个版本的名字和姓氏,以验证匹配(也因为有人可能使用“Tom”在一种情况下,在另一种情况下是“Thomas”):

df1 <- data.frame(firstName = c("John", "Josef", "Tom", "Huckleberry", "Johann"),
lastName = c("Doe", "K", "Sawyer", "Finn", "Bach"))

df2 <- data.frame(firstName = c("John", "josef", "Thomas", "Huck", "Pap", "Johann Sebastian", "Johann"),
lastName = c("Doe", "K", "Sawyer", "Finn", "Finn", "Bach", "Pachelbel"))

以上名称都应该为我提供一个匹配项来验证:
repeatDF <- data.frame(firstName.1 = c("John", "Josef", "Tom", "Huckleberry", "Huckleberry", "Johann", "Johann"),
lastName.1 = c("Doe", "K", "Sawyer", "Finn", "Finn", "Bach", "Bach"),
firstName.2 = c("John", "josef", "Thomas", "Huck", "Pap", "Johann Sebastian", "Johann"),
lastName.2 = c("Doe", "K", "Sawyer", "Finn", "Finn", "Bach", "Pachelbel"))

然后我(可能手动?)批准除“Johann Pachelbel”和“Pap Finn”之外的所有内容,因为它们可能在名称上匹配,但与他们匹配的人不是同一个人。

到目前为止,我已经尝试过 merge (另见 match two data.frames based on multiple columns )和 %in% ,但是这两种方法都区分大小写,并且会丢失一些匹配项。我无法获得 apply使用 grep 工作的函数(必须承认:对这些功能都不是很流利),但也不知道如何使用 grep 来考虑名字和姓氏?我是在寻找正确的方向,还是应该使用完全不同的功能?

任何帮助将非常感激!

PS。似乎有很多很多类似的问题,但要么是针对不同的程序,要么不需要我的两个考虑——如果我的问题确实已经有了答案,请道歉!

最佳答案

这似乎基于 OP 的评论和新数据集。我改了df2稍微所以名称在两个数据框中的顺序不同。

df1 <- data.frame(firstName = c("John", "Josef", "Tom", "Huckleberry", "Johann"),
lastName = c("Doe", "K", "Sawyer", "Finn", "Bach"))

df2 <- data.frame(firstName = c("John", "josef", "Huck", "Pap", "Johann Sebastian", "Johann", "Thomas"),
lastName = c("Doe", "K", "Finn", "Finn", "Bach", "Pachelbel", "Sawyer"))
get.match <- function(A,B) {
A <- as.list(tolower(A)); B <- as.list(tolower(B))
match.last <- grepl(A$lastName,B$lastName)|grepl(B$lastName,A$lastName)
match.first <- grepl(A$firstName,B$firstName)|grepl(B$firstName,A$firstName)
match.first | match.last
}

indx <- apply(df2,1,function(row) apply(df1,1,get.match,row))
indx
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE
# [4,] FALSE FALSE TRUE TRUE FALSE FALSE FALSE
# [5,] FALSE FALSE FALSE FALSE TRUE TRUE FALSE

m.1 <- df1[rep(1:nrow(df1),apply(indx,1,sum)),]
result <- cbind(m.1,do.call(rbind,apply(indx,1,function(i)df2[i,])))
result
# firstName lastName firstName lastName
# 1 John Doe John Doe
# 2 Josef K josef K
# 3 Tom Sawyer Thomas Sawyer
# 4 Huckleberry Finn Huck Finn
# 4.1 Huckleberry Finn Pap Finn
# 5 Johann Bach Johann Sebastian Bach
# 5.1 Johann Bach Johann Pachelbel

所以这使用了 get.match(...) 中实现的算法比较 df1 的行到 df2 的一行并返回 TRUE如果任一行中的名字出现在另一行的名字中,或者任一行中的姓氏出现在另一行的姓氏中。该行:
indx    <- apply(df2,1,function(row) apply(df1,1,get.match,row))

然后创建一个 indx矩阵,其中行表示 df1 中的行并且这些列代表 df2 的行元素是 TRUE如果 df1 的对应行和 df2匹配。这允许在 df1 中进行多个匹配的可能性。或 df2 .最后我们转换这个 indx矩阵到 result你想使用:
m.1     <- df1[rep(1:nrow(df1),apply(indx,1,sum)),]
result <- cbind(m.1,do.call(rbind,apply(indx,1,function(i)df2[i,])))

此代码提取 df1 的所有行在 df2 中有匹配项,然后将其绑定(bind)到 df2 中的相应行.

关于regex - R:跨两个数据帧的名字和姓氏组合(即两列)的不区分大小写匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26864950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com