【问题标题】:R: Conditional replacement using two data framesR:使用两个数据帧的条件替换
【发布时间】:2019-01-07 22:33:23
【问题描述】:

我有一个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 的水果列中的值替换为df_rep。如果df 的fruits 列中的值出现在df_rep 的eng 列中,我想用df_rep 的esp 列中的值替换它们。所以结果应该是这样的:

>df
   fruits
  manzana
  naranja
pineapple
   banana
      uva

要点:我不想使用ifelse,因为在我的真实数据框中有超过 100 个替换列表。为了便于理解,此处的示例进行了简化。也不是 for 循环,因为我的数据框包含超过 40,000 行。我正在寻找一个简单且只有一个操作的解决方案。

非常感谢您的帮助!

【问题讨论】:

    标签: r dataframe replace conditional-statements


    【解决方案1】:

    我们可以使用 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)
    

    【讨论】:

      【解决方案2】:

      另一个选项是来自dplyrcoalesce,用来自df$fruits 的相应值替换来自matchNAs。

      library(dplyr)
      df$fruits2 <- coalesce(df_rep$esp[match(df$fruits, df_rep$eng)], df$fruits)
      df
      #     fruits   fruits2
      #1     apple   manzana
      #2    orange   naranja
      #3 pineapple pineapple
      #4    banana    banana
      #5     grape       uva
      

      【讨论】:

        猜你喜欢
        • 2017-01-30
        • 2018-12-11
        • 1970-01-01
        • 2020-06-09
        • 2020-12-08
        • 1970-01-01
        • 2018-03-27
        • 2014-04-10
        • 1970-01-01
        相关资源
        最近更新 更多