通过匹配到另一个数据框来替换单词
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
我一直在四处寻找这个问题的现有解决方案 - 没有任何运气!
感谢任何帮助。
数据
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