比较两个不同表的列并替换字符串R中的特定单词

时间:2018-01-01 23:22:18

标签: r string dataframe

有人可以给我一个建议吗?我试着比较两列。一列是带有地址的字符串,另一列是带有国家/地区名称的表。但是有些国家的名字是英文的,我想用德语来代替。我也有这个问题,因为我想在数据库中使用脚本,所以我使用额外的包非常有限。我的代码真的不行。它只是替换了一行。

DF1

DE
Europa | Deutschland | München
Europa | England     | London
Europa | Germany     | Berlin
Europa | Italy       | Venedig

DF2

GE              EN
Deutschland     Germany
Italien         Italy
England         UK

结果:df1

DE
Europa | Deutschland | München
Europa | England     | London
Europa | Deutschland | Berlin
Europa | Italien     | Venedig

我尝试了以下代码:

df1 <- data.frame("DE" = c("Europa | Deutschland | München", "Europa | England | London", "Europa | Germany | Berlin ", "Europa | Italy | Venedig"))
df2 <- data.frame("GE" = c("Deutschland", "Italien", "England"), "EN" = c("Germany", "Italy", "UK"))
df1[] <- lapply(df1, as.character)
df2[] <- lapply(df2, as.character)

for(i in seq_along(df1)) df1$DE <- gsub(df2$EN, df2$GE, df1$DE, fixed = FALSE)

2 个答案:

答案 0 :(得分:1)

您应该在[i]循环中添加for并使用fixed = TRUE,因为您使用的是固定模式,而不是正则表达式。在代码中找到其他修改:

for(i in seq_along(df2$EN)) {
    df1$DE <- gsub(df2$EN[i], df2$GE[i], df1$DE, fixed = TRUE)
}
df1$DE

## [1] "Europa | Deutschland | München"
## [2] "Europa | England | London"     
## [3] "Europa | Deutschland | Berlin "
## [4] "Europa | Italien | Venedig" 

P.S。您可以在stringsAsFactors = FALSE中使用data.frame()来获取字符串而不是因素:

df1 <- data.frame("DE" = c("Europa | Deutschland | München",
                           "Europa | England | London", 
                           "Europa | Germany | Berlin ",
                           "Europa | Italy | Venedig"),
                  stringsAsFactors = FALSE)

df2 <- data.frame("GE" = c("Deutschland", "Italien", "England"), 
                  "EN" = c("Germany", "Italy", "UK"),
                  stringsAsFactors = FALSE)

答案 1 :(得分:0)

以下是基于myword和替换的解决方案。拆分列的原因是我只想替换第二列中的名称。如果我们将merge与for循环一起使用,则可能会替换来自其他列的匹配单词。 gsub是最终输出。

第1步:将df4中的列与df1分开。

|

第2步:合并df1_1 <- as.data.frame(do.call(rbind, lapply(strsplit(df1$DE, split = "\\|"), trimws)), stringsAsFactors = FALSE) df1_1

df2

第3步:如果df3 <- merge(df1_1, df2, by.x = "V2", by.y = "EN", all.x = TRUE) 列不是GE,则替换值。

NA

第4步:折叠所有列。准备最终输出。

df3$V2 <- ifelse(!is.na(df3$GE), df3$GE, df3$V2)

数据

df3$DE <- apply(df3[, c("V1", "V2", "V3")], 1, paste, collapse = " | ")
df4 <- df3[, "DE", drop = FALSE] 

df4
#                               DE
# 1 Europa | Deutschland | München
# 2      Europa | England | London
# 3  Europa | Deutschland | Berlin
# 4     Europa | Italien | Venedig