通过匹配到另一个数据框来替换单词

Replace word by matching to another data frame

我一直在四处寻找这个问题的现有解决方案 - 没有任何运气!

感谢任何帮助。

数据

long.name <- c("REPUBLIC OF BELARUS", "REPUBLIC OF VIETNAM"
, "GOVERNMENT OF JAMAICA", "LEBANESE REPLUBLIC")

result <- c(256, 578, 467, 698)

df1 <- data.frame(long.name, result)

country <- c("BELARUS", "VIETNAM", "JAMAICA", "LEBANESE")

country.code <- c("BLR", "VNM", "JAM", "LBN")

df2 <- data.frame(country, country.code)

问题

我希望用相应的代码 df2$country.code.

替换国家名称的长版本 只有 df1$long.name

即最终结果将如下所示:

df1$final.aim <- c("REPUBLIC OF BLR", "REPUBLIC OF VNM", 
"GOVERNMENT OF JAM", "LBN REPLUBLIC")

首先,我建议将因子 long.name 列转换为字符。这使得一些字符串操作更容易;特别是,它可以在列中增量替换值,而不必担心因子水平。或者,由于您想在新列 final.aim 中构建最终结果,您可以将 long.name 列的字符串化副本分配给新列,然后处理该

我的解决方案使用 for 循环一次迭代一个替换候选,IOW 一次迭代一行 df2。对于每一行,它围绕目标词构建一个正则表达式(我假设你只想匹配整个词,因此 \b 词边界断言的定界)。然后它会查找与模式匹配的长名称,并使用对 sub().

的调用,将所有名称中的目标词替换为国家代码,同样取自 df2
df1$final.aim <- as.character(df1$long.name);
for (sri in seq_len(nrow(df2))) {
    pat <- paste0('\b',df2$country[sri],'\b');
    lris <- grep(pat,df1$final.aim);
    df1$final.aim[lris] <- sub(pat,df2$country.code[sri],df1$final.aim[lris]);
};
df1;
##               long.name result         final.aim
## 1   REPUBLIC OF BELARUS    256   REPUBLIC OF BLR
## 2   REPUBLIC OF VIETNAM    578   REPUBLIC OF VNM
## 3 GOVERNMENT OF JAMAICA    467 GOVERNMENT OF JAM
## 4    LEBANESE REPLUBLIC    698     LBN REPLUBLIC

一个选项 stringr,

library(stringr)
#pattern
ptrn1 <- str_extract(df1$long.name, paste(df2$country, collapse='|'))
#replacement
rpl <- df2$country.code[match(df2$country, ptrn1)]

df1$long.name <- str_replace_all(df1$long.name, ptrn1, rpl)
df1
#          long.name result
#1   REPUBLIC OF BLR    256
#2   REPUBLIC OF VNM    578
#3 GOVERNMENT OF JAM    467
#4     LBN REPLUBLIC    698