R:使用两个数据框进行条件替换

时间:2018-07-31 13:45:04

标签: r dataframe replace conditional-statements

我有一个像这样的数据框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多行。我正在寻找一种简单且仅一个动作的解决方案。

非常感谢您的帮助!

2 个答案:

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