【发布时间】:2013-12-18 03:20:25
【问题描述】:
我正在使用以下 2 个函数来查找字符串中的国家/地区名称, 匹配名称,将其放入数据框中的新列中, 然后从原字符串中删除国家名称:
library("stringr")
ListofCountries <- read.table(file="https://raw.github.com/umpirsky/country-list/master/country/cldr/en/country.csv",header=T,sep=",")
CoffeeTable <- data.frame(Product=c("Kenya Ndumberi", "Kenya Ndumberi", "Finca Nombre de Dios", "Finca La Providencia", "Las Penidas", "Las Penidas", "Las Penidas", "Panama Duncan", "Panama Duncan", "Panama Duncan", "Panama Duncan", "Panama Duncan", "Panama Duncan", "Progresso", "Progresso", "Progresso", "Progresso", "Finca El Injerto", "Finca El Injerto", "Finca El Injerto", "Finca El Injerto", "Finca El Injerto", "Finca El Injerto", "El Socoro Reserva Don Diego", "El Socoro Reserva Don Diego", "El Socoro Reserva Don Diego", "El Socoro Reserva Don Diego", "\nEl Socoro Reserva Don Diego", "El Socoro Reserva Don Diego", "Thiriku Nyeri", "Thiriku Nyeri", "Thiriku Nyeri", "Thiriku Nyeri", "Kenya Kia Oro", "Kenya Kia Oro", "Kenya Kia Oro", "Kenya Kia Oro", "Kenya Kia Oro", "Bufcafe Natural Sundried Microlot", "Bufcafe Natural Sundried Microlot", "Bufcafe Natural Sundried Microlot", "Geisha", "Geisha", "Geisha", "Pacamara", "Pacamara", "Pacamara", "Pacamara", "Bolivia", "Pacamara", "Bolivia", "Pacamara", "Bolivia", "Brazil yellow bourbon pea berry", "Finca El Vintilador", "\nWashed Yirgacheffe", "Finca El Vintilador", "Washed Yirgacheffe", "Washed Yirgacheffe", "Washed Yirgacheffe", "Leza", "Finca La Libertad", "Pacamara", "Pacamara", "Pacamara", "Finca La Bolsa", "Thunguri Kenya", "Thunguri Kenya", "Thunguri Kenya", "Thiriku Nyeri", "Thiriku Nyeri", "Thiriku Nyeri", "Pedregal", "Pedregal", "Barrel Aged", "Pedregal", "Barrel Aged", "Toarco Jaya Peaberry Sulawesi", "Amigo de Buesaco", "Amigo de Buesaco", "Amigo de Buesaco", "Barrel Aged", "Toarco Jaya Peaberry Sulawesi", "\nToarco Jaya Peaberry Sulawesi", "El Cypress", "El Cypress", "Kenya Kia Oro", "Kenya Kia Oro", "Kenya Kia Oro", "Kenya Kia Oro"))
CoffeeTable$Country <- str_trim(str_match(tolower(CoffeeTable$Product),
tolower(paste(ListofCountries, collapse="|")))[,1])
CoffeeTable$Product <- str_trim(gsub(tolower(paste(ListofCountries, collapse="|")), replacement="",
CoffeeTable$Product, ignore.case=T))
问题 1 - 这非常慢。如何使这些功能更快?
问题 2 - 这仅捕获国家的正式名称。有谁知道常用国名的好列表? (例如“中国”与“中华人民共和国”)
谢谢!
编辑:这里列出了 90 个咖啡名称,以使其成为可重复的示例; 我想在我的实际应用程序中补充一点,CoffeeTable 已经存在并且有大约 2,000 行和 45 列。我不是在寻找更快的方法来构建 data.frame / etc。
谢谢!
编辑 2: 问题 2 已得到解答,现在我只是在尝试优化这 2 个功能,以便它们不需要 5 - 10 秒即可运行!
【问题讨论】:
-
嗨,你能提供一个可重现的例子吗?在您上面的代码中,CoffeeTable 结构是未定义的。
-
要提供可重现的数据集,请尝试使用
dput并将其输出粘贴到您的问题中。例如,对两个表的前 100 行尝试使用dput(head(countrycode_data,100))和dput(head(CoffeeTable,100))。 -
嗨@TommyO'Dell,我已经编辑了这个问题,并把它作为一个可重复的例子——谢谢!
-
嗨@exegetic,我已经把它变成了一个可重复的例子——谢谢!
-
@JayCo - 在您的 CoffeeTable 示例中,您需要将产品名称括在引号中,否则 R 会将它们视为变量名称。这段代码是为你运行的吗??
标签: regex r optimization