【问题标题】:R: Splitting Data in Column by Ambiguous ValuesR:按不明确的值拆分列中的数据
【发布时间】:2020-06-04 12:01:57
【问题描述】:

假设我们有这个数据:

Country                 Value
China Word1             1,427,647,786
India Word2             1,352,642,280
United States Word3     327,096,265
Indonesia WordsHere     267,670,543
Pakistan ThisIsAWord    212,228,286
Brazil Test Test        209,469,323
Nigeria Hello           195,874,683
Bangladesh Word5        161,376,708
Russia Words            145,734,038
Mexico This Word        126,190,788

我想将 Country 与其旁边的单词(例如 Word1 ....)分成两列。显然我可以只给我们一个分隔符,例如空格或逗号。但这变得有问题,因为有些国家在其中有空间。它位于一个应用程序中,我不一定知道将使用哪些国家/地区。所以我不能手动列出例外情况。

我得到的最接近的是使用我在网上找到的各种“模糊匹配”功能。然而,它们似乎只在 90% 的时间内工作。不幸的是,在这个用例中这是不可接受的......

编辑:在@Limey 的评论之后,在一些单词之间添加了空格以更准确地反映手头的数据。

【问题讨论】:

  • 在你的测试数据中,国家后面只有一个单词。那么为什么不直接查找 last 单词并将其删除呢?如果你的真实数据有边缘情况,你可能有多词国家和多词垃圾,或者没有尾随词的国家,那么我认为唯一 100% 可靠的方法是查看国家列表。
  • 这是个好主意,谢谢!但是,我确实只是再次查看了数据,并且存在多词(带空格)的情况。我会看看国家/地区查询。
  • @Limey,我将如何使用查找表将其与上面的 Country 列相匹配?因为它们不匹配 100%。那是我已经尝试过的方法,这意味着我有一个查找列表,然后我使用了其中一种模糊匹配方法。它们不准确。

标签: r datatable data.table


【解决方案1】:

回答OP第二条评论中的问题:

# Test data
text <- c("China Word1", "India Word2", "United States Word3", "Indonesia WordsHere", 
          "Pakistan ThisIsAWord", "Brazil Test Test", "Nigeria Hello",
          "Bangladesh Word5", "Russia Words", "Mexico This Word")

countryList <- c("China", "India", "United States", "Indonesia", 
                 "Pakistan", "Brazil", "Nigeria", "Bangladesh", 
                 "Russia", "Mexico")

# Demo code
pattern <- paste0(countryList, collapse="|")
foundCountries <- stringi::stri_match_first(text, regex=pattern)
foundCountries

给予

     [,1]           
 [1,] "China"        
 [2,] "India"        
 [3,] "United States"
 [4,] "Indonesia"    
 [5,] "Pakistan"     
 [6,] "Brazil"       
 [7,] "Nigeria"      
 [8,] "Bangladesh"   
 [9,] "Russia"       
[10,] "Mexico"       

【讨论】:

    【解决方案2】:

    这是一个基于library(countrycode) 的解决方案,其中包含一个包含各种变体国家名称的大型字典;这里我选择存储在codelist$country.name.en的英文国名:

    数据:

    df <- data.frame(countries = c("China Word1", "India Word2", "United States Word3", "Indonesia WordsHere", 
              "Pakistan ThisIsAWord", "Brazil Test Test", "Nigeria Hello",
              "Bangladesh Word5", "Russia Words", "Mexico This Word"))
    

    解决方案:

    该解决方案的工作原理是将codelist$country.name.en 中的所有国家/地区名称定义为由交替标记| 连接的模式,并在反向引用\\1 中记住每个国家/地区名称,从中可以替换冗长的国家/地区名称​​iff em> 他们匹配:

    library(countrycode)
    
    df$country_clean <- gsub(paste0(".*\\b(", paste(codelist$country.name.en, collapse="|"),")\\b.*"), 
                         "\\1", df$countries, perl = T )
    

    结果:

    df
                  countries country_clean
    1           China Word1         China
    2           India Word2         India
    3   United States Word3 United States
    4   Indonesia WordsHere     Indonesia
    5  Pakistan ThisIsAWord      Pakistan
    6      Brazil Test Test        Brazil
    7         Nigeria Hello       Nigeria
    8      Bangladesh Word5    Bangladesh
    9          Russia Words        Russia
    10     Mexico This Word        Mexico
    

    【讨论】:

    • 这是一个很好的资源,@Chris。我没有意识到这一点。感谢您指出。
    猜你喜欢
    • 2021-11-23
    • 2016-06-27
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多