我有两个数据框。我想将 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