поиск конкретного значения из другого кадра данных по совпадению строк - PullRequest
0 голосов
/ 01 мая 2018

У меня есть два упомянутых ниже кадра данных:

DF1

ID     Value
AL-1   Adf "& ert
AL-2   new '? rti
AL-3   oll- drt/
AL-4   plr -rte-

DF2

Value        Type           
Adf & ert    AA
new  rti     AA
oll-drt&     AB
plr-rte      AC

Требуемый вывод:

ID     Value         Type
AL-1   Adf "& ert    AA
AL-2   new '? rti    AA
AL-3   oll- drt/     AB
AL-4   plr -rte-     AC

Я хочу сопоставить символы DF1 в столбце Value с символами столбца DF2 Value и получить Type.

Пытался использовать библиотеку фонетики, но пока не смог, потребовал некоторых предложений здесь.

Ответы [ 4 ]

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

Вы можете связать два фрейма данных, если есть много столбцов, которые нужно объединить:

   cbind(df1,df2[max.col(-adist(df1$Value,df2$Value,partial=T)),])
        ID      Value     Value Type
    1 AL-1  Adf & ert Adf & ert   AA
    2 AL-2 new '? rti  new  rti   AA
    3 AL-3  oll- drt/  oll-drt&   AB
    4 AL-4  plr -rte-   plr-rte   AC
0 голосов
/ 01 мая 2018

Вы можете использовать функцию adist, чтобы получить приблизительное «расстояние» между строками для каждого из ваших значений в df1$Value по сравнению с df2$Value. Затем вы можете взять тот с минимальным расстоянием (таким образом, точные совпадения будут иметь приоритет):

library(utils)
df1$Type <- df2$Type[apply(adist(df1$Value, df2$Value), 1, which.min)]

df1
#    ID      Value Type
#1 AL-1 Adf "& ert   AA
#2 AL-2 new '? rti   AA
#3 AL-3  oll- drt/   AB
#4 AL-4  plr -rte-   AC
0 голосов
/ 01 мая 2018

Нечеткое совпадение может работать.

library(fuzzyjoin)

library(stringr)
DF1 %>% fuzzy_left_join(DF2, by = c("Value" = "Value"), match_fun = str_detect)
0 голосов
/ 01 мая 2018

Вы можете использовать функцию слияния в R

df1=data.frame(ID=c("AL-1","AL-2","AL-3"),Value=c("Adf & ert","new '? rti","oll- drt/"))
df2=data.frame(Value=c("Adf & ert","new '? rti","oll- drt/"),Type=c("AA","AA","AB"))

df=merge(df1,df2,by = "Value")
...