【问题标题】:R: pmatch: 'TERESA DEL CA' does not match with 'TERESA DEL#CARMEN'R:pmatch:“TERESA DEL CA”与“TERESA DEL#CARMEN”不匹配
【发布时间】:2016-10-23 09:38:12
【问题描述】:

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

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

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。在试图弄清楚为什么这么多 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)]     
}}

【问题讨论】:

标签: r dataframe string-matching bigdata


【解决方案1】:

如果 # 符号是唯一的问题,您可以在函数中添加 duplicates.ok=TRUE Test.Takers$Application.Number[i] &lt;- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]), subset$First.Names),dup=T]

或者你可以去掉#号 Test.Takers$Application.Number[i] &lt;- subset$Application.Number[pmatch(as.character(Test.Taker$First.Name[i]),gsub("#"," ",subset$First.Names))]

【讨论】:

  • 好的,gsubing 为示例代码工作。我会检查一下我拥有的更大的data.frame。代码需要很长时间才能运行,但我应该能在明天告诉你结果。非常感谢!
  • gsubing 有效,但它只找到了 1/6 的缺失观测值。我必须继续弄清楚如何解决这个问题......
  • 您可能还有其他特殊情况。您也可以同时尝试 gsub 和 dup=T。
  • 对我来说唯一明显的情况是名称中带有“#”。事实证明这些名字只是问题的 1/6我找到了大约 2000 人的申请号。
猜你喜欢
  • 2022-07-07
  • 2019-04-18
  • 1970-01-01
  • 2011-08-02
  • 2014-06-13
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多