合并R中具有相同和不同列名的两个不完整数据集

时间:2015-02-27 18:06:04

标签: r merge dataset

我认为说明这一点的最好方法是通过示例。

I have my primary dataset:
ID  ColA    ColB        ColC        ColE
2   Leaf    Dirt                     1
4   Plant   Rock                     2 
1   Tree    Mountain                 3
9   Grass   Boulder                  4
5   Weed    Dust                     5
12                      Sky          A
11                      Cloud        B
6                       Blue         C
7                       Atmosphere   D  
8                       White        E

然后第二个数据集我想将我的主要与

结合起来
ID  ColA    ColB            ColD
6   2x2     11x1             11
7   3x3     16x6             12
8   6x6     17x7             13
11  8x8     18x8             14
12  0x0     19x9             15

最终结果应为

   ID   ColA    ColB        ColC        ColE  ColD
    2   Leaf    Dirt         NA          1     NA
    4   Plant   Rock         NA          2     NA
    1   Tree    Mountain     NA          3     NA
    9   Grass   Boulder      NA          4     NA
    5   Weed    Dust         NA          5     NA
    12  0x0     19x9         Sky         A     15
    11  8x8     18x8         Cloud       B     14
    6   2x2     11x1         Blue        C     13
    7   3x3     16x6         Atmosphere  D     12
    8   6x6     17x7         White       E     11

我并不关心ID的排序方式,但我希望保持主数据集的列名顺序相同。第二个数据集中与主数据库列名不同的所有列都位于主数据集的最右侧,如ColD示例所示。

每当我尝试编写合并函数时,我最终会得到各种重复,双精度或不实际合并的列。

如您所见,这两个数据集在某些领域都不完整,合并这两个数据的好方法是什么?

谢谢。

编辑:LukeA你的解决方案给了我这个:

ID  ColA    ColB       ColC       ColE   ColD
2   Leaf    Dirt                   1    NA
4   Plant   Rock                   2    NA
1   Tree    Mountain               3    NA
9   Grass   Boulder                4    NA
5   Weed    Dust                   5    NA
12                    Sky          A    NA
11                    Cloud        B    NA
6                     Blue         C    NA
7                     Atmosphere   D    NA
8                     White        E    NA
6   2x2     11x1      NA          NA    11
7   3x3     16x6      NA          NA    12
8   6x6     17x7      NA          NA    13
11  8x8     18x8      NA          NA    14
12  0x0     19x9      NA          NA    15

1 个答案:

答案 0 :(得分:0)

这是一个快速&对你的例子有用的脏方法:

df3 <- merge(df1, df2, "ID", all = T)
df3[df3 == ""] <- NA
df3 <- df3[match(df1$ID, df3$ID), ]
df3[!complete.cases(df3[c("ColA.x", "ColB.x")]), c("ColA.x", "ColB.x")] <- df3[!complete.cases(df3[c("ColA.x", "ColB.x")]), c("ColA.y", "ColB.y")]
df3 <- df3[, !names(df3) %in% c("ColA.y", "ColB.y")]
names(df3)[2:3] <- c("ColA", "ColB")
df3
#    ID  ColA     ColB       ColC ColE ColD
# 2   2  Leaf     Dirt       <NA>    1   NA
# 3   4 Plant     Rock       <NA>    2   NA
# 1   1  Tree Mountain       <NA>    3   NA
# 8   9 Grass  Boulder       <NA>    4   NA
# 4   5  Weed     Dust       <NA>    5   NA
# 10 12   0x0     19x9        Sky    A   15
# 9  11   8x8     18x8      Cloud    B   14
# 5   6   2x2     11x1       Blue    C   11
# 6   7   3x3     16x6 Atmosphere    D   12
# 7   8   6x6     17x7      White    E   13