Сравните и уточните строки в отдельных столбцах с помощью пакета refinr - PullRequest
0 голосов
/ 03 мая 2018

Много времени я трачу на объединение двух фреймов данных в столбце страны, муниципалитета, названия или партии. Теперь нам пригодится пакет refinr , R-порт для OpenRefine. Только я пока не понял, как сравнить два «одинаковых» столбца и назвать строки, как я использую 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 голосов
/ 03 мая 2018

Я не уверен, что это лучшее использование refinr, которое служит в основном для согласования написания слова в одном столбце. То, что вы хотите сделать, выглядит как нечеткое соединение, и для этого есть пакет R. Пример использования может быть:

library(tidyverse)
library(fuzzyjoin)


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"
)

df3 <- df2 %>%
  stringdist_left_join(df1,
                       distance_col = "dist", 
                       method='soundex') %>% 
  select(uid=uid.x, name=name.y, value)

df3
  # 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

Я использовал алгоритм soundex, но есть и другие методы, основанные на пакете stringdist .

0 голосов
/ 03 мая 2018

Вы можете попробовать

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 функциями. Таким образом, вы можете включить gsub для изменения этой конкретной строки, добавив эту строку mutate(name=gsub("blu","blue",name))

...