首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R: pmatch:'TERESA DEL CA‘与'TERESA DEL#CARMEN’不匹配

R: pmatch:'TERESA DEL CA‘与'TERESA DEL#CARMEN’不匹配
EN

Stack Overflow用户
提问于 2016-06-21 17:45:54
回答 1查看 58关注 0票数 1

我有两个具有几乎相同数据的数据:

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值,我想用Every.Student.In.The.Country.中的Application.Numbers填充该字段。

我试图通过从Every.Student.In.The.Country.中删除Paternal.Names和Maternal.Names来做到这一点。然后,我将使用以下代码填充Test.Takers$Application.Number

代码语言:javascript
复制
Test.Takers$Application.Number[i] <- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]), subset$First.Names)]

这可以填补约2/3的Test.Takers$Application.Number。在试图找出为什么如此多的Every.Student.In.The.Country$First.Name仍然是NA之后,我发现来自该Test.Takers$Application.Number的一些名称中包含一个'#‘。我认为“#”抛出了pmatch函数,这样来自Test.Takers$First.Name的名称(如'TERESA DEL CA‘)与来自Every.Student.In.The.Country$First.Name的名称(如'TERESA DEL#CARMEN’)不匹配。

任何关于如何解决这个问题的建议都是很棒的。我觉得某种类似regex函数的东西可能会有所帮助,但我不太确定。

编辑:下面是一些复制问题的示例代码。请记住,我所处理的真实数据相当大--大约有30000和12000000个观测结果。如果你仔细看了这段代码,发现没有效率,请告诉我。

代码语言:javascript
复制
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)]     
}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-21 18:58:28

如果#符号是您可以在函数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))]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37951193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档