我有两个数据帧。我想将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
由于我的数据更大并且要匹配的名称更多,因此我该如何常规地执行此操作。
谢谢!
答案 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