代码之家  ›  专栏  ›  技术社区  ›  alexb523

r-如果在另一个数据帧上找到id,则合并并替换列

  •  0
  • alexb523  · 技术社区  · 8 年前

    我有两个数据帧,如下所示,并试图改进我的代码,所以 letters 列 df1 应该替换为 信件 列 df2 如果匹配的话。

    df1 <- data.frame(ID = c(1,3,2,4,5), Letters = LETTERS[1:5], stringsAsFactors = F)
    df2 <- data.frame(ID = c(1,3,4), Letters2 = "F", stringsAsFactors = F)
    
    desired:
    ID  letters
    1   F
    2   B
    3   F
    4   D
    5   F
    

    就像在一行中执行以下操作:

    desired <- merge(df1, df2, by = "ID", all.x = T)
    desired$letters <- ifelse(is.na(desired$letters2), desired$letters, desired$letters2)
    desired$letters2 <- NULL
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   jkdev james murphy    8 年前

    试试这个:

    library(tidyverse)
    df1%>%
       left_join(df2)%>%
       mutate(Letters=coalesce(letters2,Letters),letters2=NULL)
    Joining, by = "ID"
      ID Letters
    1  1       F
    2  2       B
    3  3       F
    4  4       F
    5  5       E
    
        2
  •  0
  •   akrun    8 年前

    我们可以使用数字“id”作为索引,将“letters”中的值更改为“letters2”(都是“f”)中的值。

    df1$Letters[df2$ID] <- df2$letters2
    df1
    #  ID Letters
    #1  1       F
    #2  2       B
    #3  3       F
    #4  4       F
    #5  5       E
    

    或使用 data.table

    library(data.table)
    setDT(df1)[df2, Letters := Letters2, on = .(ID)]
    df1
    #   ID Letters
    #1:  1       F
    #2:  3       F
    #3:  2       C
    #4:  4       F
    #5:  5       E