Подберите столбцы хотя бы с одним похожим словом - PullRequest
0 голосов
/ 16 января 2019

У меня есть два кадра данных. Я хочу заменить идентификаторы в DF1 на идентификаторы в DF2. Я знаю, что могу сделать это:

 DF1$ID<-DF2$ID[match(DF1$NAME,DF2$NAME, incomparables = NA)]

Но я хочу добавить grepl или что-то подобное, чтобы узнать хотя бы одно слово из DF1$NAME, которое совпадает с DF2$NAME

Так что в случае с примером я хочу сопоставить слова «натрий», хотя в DF2 написано, что натрий завершен

Так вот пример:

DF1

   NAME        ID    value
 sodium        NA     0,1
 chloride      NA     0,5

DF2

      NAME              ID    value
 sodium complete       123    0,5
 chloride complete     456    0,8

Результат в DF1

             ID    value
 sodium      123    0,1
 chloride    456     0,5

Как я могу сделать это в общем, так как мои данные больше и с большим количеством имен для соответствия.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вот как это сделать с grepl,

sapply(df1$NAME, function(i)df2$ID[grepl(i, df2$NAME)])
#  sodium chloride 
#     123      456 

Назначьте его на ID столбец,

df1$ID <- sapply(df1$NAME, function(i) df2$ID[grepl(i, df2$NAME)])
df1
#      NAME  ID value
#1   sodium 123   0.1
#2 chloride 456   0.5

Синтаксис может немного отличаться от @snoram,

df2$ID[sapply(df1$NAME, function(x) grep(x, df2$NAME)[1])]
0 голосов
/ 16 января 2019

Использование fuzzyjoin -

library(fuzzyjoin)
df1 <- data.frame(
  "NAME" = c("sodium", "chloride"),
  "value" = c("0,1","0,2")
)
df1$ID <- NA

df2 <- data.frame(
  "NAME" = c("sodium", "chloride"),
  "ID" = c(123,456),
  "value" = c("0,1","0,2")
)

# Here is the actual logic
df <- stringdist_inner_join(df1,df2, by="NAME")
df
df <- df[,c("NAME.x","ID.y", "value.x")]
colnames(df) <- c("NAME", "ID", "value")
rownames(df) <- df$NAME
df$NAME <- NULL
df

выход

          ID value
sodium   123   0,1
chloride 456   0,2
...