使用refinr包比较和优化单独列中的字符串

时间:2018-05-03 10:23:16

标签: r string-matching openrefine

我的大部分时间花在合并国家,自治市,名称或政党专栏的两个数据框架上。现在,它是refinr package,一个OpenRefine的R端口,派上用场。只有我还没弄清楚如何比较两个“相同”列并命名字符串,就像我在一个向量上使用refinr一样。我不是那种R经验,所以这听起来有点模糊。也许我的例子让事情变得更加清晰。

library(tidyverse)
library(refinr)

# I would like to add the values (and the right name's) of this example df...
df1 <- tribble(
  ~uid, ~name, ~value,
  "A", "Red", 13,
  "A", "violet", 145,
  "B", "Blue", 3,
  "B", "yellow", 56,
  "C", "yellow-purple", 789,
  "C", "green", 17
  )

# ...to the following df
df2 <- tribble(
  ~uid, ~name,
  "A", "red",
  "B", "blu",
  "C", "YellowPurple",
  "C", "green"
  )

# The following code of course produces NA values
df3 <- left_join(df1, df2, by = c("uid", "name"))

# While the following is the desired outcome

# A tibble: 4 x 3
  uid   name           value
  <chr> <chr>          <dbl>
1 A     Red             13 
2 B     Blue             3
3 C     yellow-purple  789   
4 C     green           17

key_collision_merge()n_gram_merge()处理单个向量中的字符串。我的问题是,我可以比较和更改两列之间的字符串而不是一列吗?

如果可以的话,那将给我安全这么多时间!

提前致谢。

2 个答案:

答案 0 :(得分:1)

我不确定这是read_excel("FileName", sheet="nameofsheet") 的最佳用法,它主要用于协调单个列中的单词拼写。你想做什么看起来像一个模糊连接,并有一个R package for that。使用的一个例子可能是:

refinr

我使用了soundex算法,但还有其他方法,都基于stringdist package

答案 1 :(得分:0)

你可以尝试

library(refinr)
library(tidyverse)
df1 %>% 
  bind_rows(df2, .id = "id") %>% 
  mutate(key=key_collision_merge(name)) %>% 
  split(.$id) %>% 
  inner_join(x=select(.[[1]],-id), y=select(.[[2]], uid, key), by=c("uid", "key"))
# A tibble: 3 x 4
  uid   name          value key         
  <chr> <chr>         <dbl> <chr>       
1 A     Red             13. Red         
2 C     yellow-purple  789. YellowPurple
3 C     green           17. green  

"blu"函数无法将"blue"识别为refiner。因此,您可以通过添加此行mutate(name=gsub("blu","blue",name))

来包含gsub来更改此特定字符串