r语言 - 匹配至少一个相似单词的列



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

 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

我如何以一般方式执行此操作,因为我的数据更大,需要匹配的名称更多。

谢谢!

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

使用模糊连接-

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

最新更新