【问题标题】:Rmatching strings across columns of two dataframes in RR在R中的两个数据框的列之间匹配字符串
【发布时间】:2021-10-18 00:44:17
【问题描述】:

抱歉,在我匆忙发布我的问题时,我忘了遵守发布的基本规则。我已经按照这些规则编辑了我的帖子:

R 专家, 我很欣赏之前提出过类似的问题,但我无法将之前建议的解决方案调整到我的具体数据问题。我基本上有一个数据框(称为 df1),其中一列是一串句子,其中一部分包含城市名称和国家名称。例如,数据框 df1 有一个名为 bus_desc 的列,其中包含以下数据:

bus_desc
Company ABCD has a base capital of USD 5 million. Company ABCD is based in Mobile, Alabama, US. It is also known to have issued 10 million shares .....
Company XYZ has a history of producing bolts. Company XYZ operates out of Delhi, India. Its directors decided to....

在另一个数据框(称为 df2)中,我有两列数据(命名为城市和国家),其中每一行包含一个城市名称和对应的国家/地区,如下所示:

city country
MOBILE US
DELHI INDIA
LONDON UK

我希望 R 在数据框 df1 中搜索该列的每一行的句子字符串,并将城市(国家相同)与数据框中相关列中的城市名称(以及国家名称)进行匹配df2。如果匹配,我想在数据框 df1 中创建一个名为 city 的列,并从数据框 df2 中提取城市名称并将其分配给数据框 df1 中的行。我的最终输出应该是这样的:

bus_desc city country
Company ABCD has a base capital of USD 5 million. Company ABCD is based in Mobile, Alabama, US. It is also known to have issued 10 million shares ..... MOBILE US
Company XYZ has a history of producing bolts. Company XYZ operates out of Delhi, India. Its directors decided to.... DELHI INDIA

如果存在,任何人都可以建议一个简单的解决方案吗?我尝试了以下方法,但它不起作用

df1 <- df1 %>% rowwise() %>% 
  mutate(city=ifelse(grepl(toupper(bus_desc),df2$city),df2$city,df1))

非常感谢您的解决方案和帮助。

问候, 开发

【问题讨论】:

    标签: r string-matching


    【解决方案1】:

    您可以使用str_extract 提取df2 中列出的citycountry 值。

    library(dplyr)
    library(stringr)
    
    df1 %>%
      mutate(city = str_extract(toupper(bus_desc), str_c(df2$city, collapse = '|')), 
             country = str_extract(toupper(bus_desc), str_c(df2$country, collapse = '|')))
    
                                bus_desc
    #1 Company ABCD has a base capital of USD 5 million. Company ABCD is based in Mobile, Alabama, US. It is also known to have issued 10 million shares
    #2                                  Company XYZ has a history of producing bolts. Company XYZ operates out of Delhi, India. Its directors decided to
    
    #    city country
    #1 MOBILE      US
    #2  DELHI   INDIA
    

    数据

    如果您在reproducible format 中提供数据会更容易提供帮助-

    df1 <- data.frame(bus_desc = c('Company ABCD has a base capital of USD 5 million. Company ABCD is based in Mobile, Alabama, US. It is also known to have issued 10 million shares', 
                                   'Company XYZ has a history of producing bolts. Company XYZ operates out of Delhi, India. Its directors decided to'))
    df2 <- data.frame(city = c('MOBILE', 'DELHI', 'LONDON'), 
                      country = c('US', 'INDIA', 'UK'))
    

    【讨论】:

    • 嗨 Ronak,很抱歉没有使用可重现的代码格式来简化代码的测试。我会记得在以后的帖子中这样做。谢谢你的解决方案。不幸的是,在我的最后,它没有运行,它要么使 R 崩溃(收到一条 R 需要重新启动的消息),要么它给了我一条我无法理解的消息。这是 R 抛出的错误消息:
    • 错误:mutate() 输入 city 有问题。 x 正则表达式模式中的语法错误。 (U_REGEX_RULE_SYNTAX, context=`QAL EH-YE NOW|CHAGHCHARAN|LASHKAR GAH|ZARANJ|TARIN KOWT|ZAREH SHARAN|ASADABAD|TALOQAN|MAHMUD-E ERAQI|MEHTAR LAM|BARAKI BARAK|AYBAK|MAYDA SHAHR|KAROKH|SHEBERGHAN|POL -E KHOMRI|BALKH|MEYMANEH|ANDKHVOY|QALAT|GHAZNI|FEYZABAD|KONDOZ|JALALABAD|CHARIKAR|GARDIZ|BAMIAN|BAGHLAN|Farah|HERAT|MAZAR-E SHARIF|KANDAHAR|KABUL|MARIEHAMN|KRUJE|FIER|LUSHNJE|PUKE |BAJRAM CURRI|KUKES|SARANDE|ERSEKE|POGRADEC|KORCE|BERAT|COROVODE|GRAMSH|LIBRAZHD|TEPELENE|PERMET|GJIROKASTER|PESHKOPI|BURREL|LEZHE|RRESHEN|
    • 在上面的后面还有几个城市(这些都是城市名)带|最后,但错误消息如上。任何建议将不胜感激。 - 谢谢。
    • df2 有多大?多少行?似乎正则表达式不能同时处理所有城市和国家。因此,也许您需要将它们分解并分块运行。另外,我希望df2 中的所有值都是唯一的。
    • 感谢 Ronak - 从这个字符串匹配练习的角度来看,df2 实际上相当大。 df2 有 12240 个独特的城市-国家对组合。我试图分开搜索 - 在不同的代码行中匹配国家和城市。国家匹配只成功了一次,但是其他匹配字符串的尝试都失败了。我会继续尝试这个,希望能取得一些成功。非常感谢您在这方面的帮助 - 非常感谢。问候,开发人员
    猜你喜欢
    • 1970-01-01
    • 2020-07-30
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多