用至少一个相似的单词匹配列

时间:2019-01-16 10:15:16

标签: r match grepl

我有两个数据帧。我想将DF1中的ID替换为DF2中的ID。 我知道我可以做到:

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

但是我想添加grepl或类似的东西,以识别DF1$NAME中至少一个与DF2$NAME一致的单词

因此,在示例中,我想匹配单词“ sodium”,尽管在DF2中它表示Sodium complete

这是示例:

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 :(得分:1)

这是使用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])]

答案 1 :(得分:0)

使用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