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)
答案 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