【问题标题】:Merge two data.frames with replacement合并两个data.frames并替换
【发布时间】:2014-01-06 19:39:25
【问题描述】:

我有两个数据集。第一个较小,但具有更精确的数据。 我需要加入他们,但是: 1. 如果我在 Data1 中有一些数据 - 我只使用这些数据。 2. 如果我在 Data1 中没有数据,但它们在 Data2 中 - 我只使用来自 Data2 的数据。

Data1 <- data.frame(
    X = c(1,4,7,10,13,16),
    Y = c("a", "b", "c", "d", "e", "f")
)

Data2 <- data.frame(
    X = c(1:10),
    Y = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j")
)

所以我的 data.frame 应该是这样的:

DataJoin <- data.frame(
    X = c(1,4,7,10,13,16,7,8,9,10),
    Y = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j")
)

我该怎么做? 我已经尝试过以某种方式合并表单基本包和 data.table 包的选项,但我无法按照我的喜好实现。

【问题讨论】:

    标签: r join merge dataframe data.table


    【解决方案1】:

    不需要加入。您可以将问题重新表述为“将在 Data2 中找到但在 Data1 中未找到的数据添加到 Data1”。所以简单地做:

    id <- Data2$Y %in% Data1$Y
    DataJoin <- rbind(Data1,Data2[!id,])
    

    给予:

    > DataJoin
        X Y
    1   1 a
    2   4 b
    3   7 c
    4  10 d
    5  13 e
    6  16 f
    7   7 g
    8   8 h
    9   9 i
    10 10 j
    

    【讨论】:

      【解决方案2】:

      使用data.table:

      d1 <- data.table(Data1, key="Y")[, X := as.integer(X)]
      d2 <- data.table(Data2, key="Y")
      
      # copy d2 so that it doesn't get modified by reference
      # i.X refers to the column X of DT in 'i' = d1's 'X'
      ans <- copy(d2)[d1, X := i.X] 
           X Y
       1:  1 a
       2:  4 b
       3:  7 c
       4: 10 d
       5: 13 e
       6: 16 f
       7:  7 g
       8:  8 h
       9:  9 i
      10: 10 j
      

      【讨论】:

      • 嗨阿伦,也许我做错了什么,但是当我使用你的代码时 - 结果我只有来自 d2 的数据...
      • 是的,您在帖子中提到 - 我只使用来自 Data2 的数据。所以,我认为您只希望替换与两者匹配的那些,其余的则保留。
      • 我猜你正在寻找类似的东西:d1[d2][is.na(X), X := X.1][, X.1 := NULL][]
      【解决方案3】:
      DataJoin <- merge(Data1, Data2, by="Y", all=TRUE)
      
      DataJoin$X.x[is.na(DataJoin$X.x)] <- DataJoin$X.y[is.na(DataJoin$X.x)]
      DataJoin[,1:2]
      
      #    Y X.x
      # 1  a   1
      # 2  b   4
      # 3  c   7
      # 4  d  10
      # 5  e  13
      # 6  f  16
      # 7  g   7
      # 8  h   8
      # 9  i   9
      # 10 j  10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2014-04-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多