R: pmatch: 'TERESA DEL CA' 与 'TERESA DEL#CARMEN' 不匹配
R: pmatch: 'TERESA DEL CA' does not match with 'TERESA DEL#CARMEN'
我有两个数据帧几乎相同的数据:
Test.Takers 具有 29260 个观察值和以下列名称:
Paternal.Name、Maternal.Name、First.Name、Application.Number
和 Every.Student.In.The.Country 具有 12000000 个观察值以下列名称:
Paternal.Name、Maternal.Name、First.Name、Application.Number
Test.Takers$Application.Number 填充了 NA 值,我想用 [=34] 中的 Application.Number 填充该字段=]Every.Student.In.The.Country。
我试图通过从 Every.Student.In.The.Country 中子集 Paternal.Names 和 Maternal.Names 来做到这一点。然后,我将使用以下代码填写 Test.Takers$Application.Number:
Test.Takers$Application.Number[i] <- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]), subset$First.Names)]
这大约可以填写 Test.Takers$Application.Number 的 2/3。在试图弄清楚为什么这么多 Test.Takers$Application.Number 仍然是 NA 之后,我发现 Every.Student.In.The.Country$First.Name 中的一些名字包含一种 '#'。我认为 '#' 会抛出 pmatch 函数,因此来自 Test.Takers$First.Name 的名称(例如 'TERESA DEL CA' 与来自 Every.Student.In.The.Country$First.Name 的名称,例如 'TERESA DEL#CARMEN'.
任何关于如何解决这个问题的建议都很棒。我觉得正则表达式函数中的一些东西可能会有所帮助,但我不太确定。
编辑:这里有一些示例代码来重现这个问题。请记住,我正在处理的真实数据非常大——每个大约有 30000 和 12000000 个观测值。如果您查看此代码并发现任何低效之处,请告诉我。
Test.Takers <- data.frame(
Paternal.Name = c('Last', 'Last', 'Paternal'),
Maternal.Name = c('Maternal', 'Last', 'Last'),
First.Name = c('First', 'Name', 'TERESA DEL CA'),
Application.Number = NA)
Every.Student.In.The.Country <- data.frame(
Paternal.Name = c('Last', 'Last', 'Last', 'Paternal', 'Paternal', 'Paternal'),
Maternal.Name = c('Maternal', 'Last', 'Maternal', 'Last', 'Maternal', 'Last'),
First.Name = c('First', 'Name', 'Whatever', 'TERESA DEL#CARMEN', 'Another', 'Something Else'),
Application.Number = c(123, 456, 789, 234, 567, 890)
)
#a place holder that will hold a subset of all a selected paternal last names
indexp <- data.frame(Paternal.Name='name')
for(i in 1:nrow(Test.Takers)) {
namep <- as.character(Test.Takers$Paternal.Name[i])
#below if statement prevents us from having to subset the paternal lastname unnecessarily
if(is.na(indexp$Paternal.Name[1]) == T | as.character(indexp$Paternal.Name[1]) != namep) {
indexp <- subset(Every.Student.In.The.Country, Paternal.Name == as.character(Test.Takers$Paternal.Name[i]))
}
#below if-statement prevents an error that arrises
#when a paternal last name does not exist
#in the Every.Student.In.The.Country file
if(is.na(indexp$Paternal.Name[1]) == F) {
#group paternal last names by maternal last names
indexm <- subset(indexp, Maternal.Name == as.character(Test.Takers$Maternal.Name[i]))
#find a partial string match to find an exact or similiar first name within the selected
#last name subset. Attaches a application.number if a match is found
Test.Takers$Application.Number[i] <- indexm$Application.Number[pmatch(as.character(Test.Takers$First.Name[i]), indexm$First.Name)]
}}
如果 # 符号是唯一的问题,您可以在函数中添加 duplicates.ok=TRUE
Test.Takers$Application.Number[i] <- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]), subset$First.Names),dup=T]
或者您可以删除 # 符号
Test.Takers$Application.Number[i] <- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]),gsub("#"," ",subset$First.Names))]
我有两个数据帧几乎相同的数据:
Test.Takers 具有 29260 个观察值和以下列名称:
Paternal.Name、Maternal.Name、First.Name、Application.Number
和 Every.Student.In.The.Country 具有 12000000 个观察值以下列名称:
Paternal.Name、Maternal.Name、First.Name、Application.Number
Test.Takers$Application.Number 填充了 NA 值,我想用 [=34] 中的 Application.Number 填充该字段=]Every.Student.In.The.Country。
我试图通过从 Every.Student.In.The.Country 中子集 Paternal.Names 和 Maternal.Names 来做到这一点。然后,我将使用以下代码填写 Test.Takers$Application.Number:
Test.Takers$Application.Number[i] <- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]), subset$First.Names)]
这大约可以填写 Test.Takers$Application.Number 的 2/3。在试图弄清楚为什么这么多 Test.Takers$Application.Number 仍然是 NA 之后,我发现 Every.Student.In.The.Country$First.Name 中的一些名字包含一种 '#'。我认为 '#' 会抛出 pmatch 函数,因此来自 Test.Takers$First.Name 的名称(例如 'TERESA DEL CA' 与来自 Every.Student.In.The.Country$First.Name 的名称,例如 'TERESA DEL#CARMEN'.
任何关于如何解决这个问题的建议都很棒。我觉得正则表达式函数中的一些东西可能会有所帮助,但我不太确定。
编辑:这里有一些示例代码来重现这个问题。请记住,我正在处理的真实数据非常大——每个大约有 30000 和 12000000 个观测值。如果您查看此代码并发现任何低效之处,请告诉我。
Test.Takers <- data.frame(
Paternal.Name = c('Last', 'Last', 'Paternal'),
Maternal.Name = c('Maternal', 'Last', 'Last'),
First.Name = c('First', 'Name', 'TERESA DEL CA'),
Application.Number = NA)
Every.Student.In.The.Country <- data.frame(
Paternal.Name = c('Last', 'Last', 'Last', 'Paternal', 'Paternal', 'Paternal'),
Maternal.Name = c('Maternal', 'Last', 'Maternal', 'Last', 'Maternal', 'Last'),
First.Name = c('First', 'Name', 'Whatever', 'TERESA DEL#CARMEN', 'Another', 'Something Else'),
Application.Number = c(123, 456, 789, 234, 567, 890)
)
#a place holder that will hold a subset of all a selected paternal last names
indexp <- data.frame(Paternal.Name='name')
for(i in 1:nrow(Test.Takers)) {
namep <- as.character(Test.Takers$Paternal.Name[i])
#below if statement prevents us from having to subset the paternal lastname unnecessarily
if(is.na(indexp$Paternal.Name[1]) == T | as.character(indexp$Paternal.Name[1]) != namep) {
indexp <- subset(Every.Student.In.The.Country, Paternal.Name == as.character(Test.Takers$Paternal.Name[i]))
}
#below if-statement prevents an error that arrises
#when a paternal last name does not exist
#in the Every.Student.In.The.Country file
if(is.na(indexp$Paternal.Name[1]) == F) {
#group paternal last names by maternal last names
indexm <- subset(indexp, Maternal.Name == as.character(Test.Takers$Maternal.Name[i]))
#find a partial string match to find an exact or similiar first name within the selected
#last name subset. Attaches a application.number if a match is found
Test.Takers$Application.Number[i] <- indexm$Application.Number[pmatch(as.character(Test.Takers$First.Name[i]), indexm$First.Name)]
}}
如果 # 符号是唯一的问题,您可以在函数中添加 duplicates.ok=TRUE
Test.Takers$Application.Number[i] <- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]), subset$First.Names),dup=T]
或者您可以删除 # 符号
Test.Takers$Application.Number[i] <- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]),gsub("#"," ",subset$First.Names))]