我有一个像这样的数据框df
:
df <- data.frame(fruits = c("apple", "orange", "pineapple", "banana", "grape"))
df_rep <- data.frame(eng = c("apple", "orange", "grape"),
esp = c("manzana", "naranja", "uva"))
>df
fruits
apple
orange
pineapple
banana
grape
>df_rep
eng esp
apple manzana
orange naranja
grape uva
我要替换df
的{{1}}水果列中的值。如果df_rep
的Fruits列中的值出现在df
的eng列中,我想用df_rep
的esp列中的值替换它们。因此结果应如下所示:
df_rep
要点:我不想使用>df
fruits
manzana
naranja
pineapple
banana
uva
,因为在我的真实数据框中有100多个替换列表。为了便于理解,此处的示例已简化。也没有for循环,因为我的数据框包含40,000多行。我正在寻找一种简单且仅一个动作的解决方案。
非常感谢您的帮助!
答案 0 :(得分:2)
我们可以使用merge
函数(模拟SQL左连接),然后使用ifelse
函数用非NA esp值替换水果:
df2 <- merge(df, df_rep, by.x = 'fruits', by.y = 'eng', all.x = TRUE)
df2$fruits <- ifelse(is.na(df2$esp), df2$fruits, df2$esp)
# fruits esp
# 1 manzana manzana
# 2 banana <NA>
# 3 uva uva
# 4 naranja naranja
# 5 pineapple <NA>
在创建数据时设置stringsAsFactors = FALSE
很重要:
df <- data.frame(fruits = c("apple", "orange", "pineapple", "banana", "grape"),
stringsAsFactors = FALSE)
df_rep <- data.frame(eng = c("apple", "orange", "grape"),
esp = c("manzana", "naranja", "uva"),
stringsAsFactors = FALSE)
答案 1 :(得分:0)
另一个选择是来自coalesce
的{{1}},将来自dplyr
的{{1}}替换为NA
的相应值。
match