通过连接向量合并2个数据帧

时间:2017-03-01 17:34:33

标签: r sorting dataframe merge

我有以下2个数据框:

> df1
     a c
[1,] 1 3
[2,] 2 3
[3,] 2 3

> df2
     b d
[1,] 7 9
[2,] 5 4
[3,] 8 4
[4,] 8 4

我试图连接矢量" a"和" b"进入" X"然后合并两个数据帧以获得以下所需结果:

> dfX
     X c  d
[1,] 1 3  NA
[2,] 2 3  NA
[3,] 2 3  NA
[4,] 7 NA 9
[5,] 5 NA 4
[6,] 8 NA 4
[7,] 8 NA 4

NAs是故意的。

我确信使用merge(df1,df2,by.x,by.y,all)必须有可能,但是,尽管我付出了最大的努力和研究,但我无法弄明白。

最后,完成上述操作后,我想按列X按升序对数据框进行排序(以便行[4,] 7 NA 9在行[5,] 5之后结束NA 4)为了获得:

> dfX
     X c  d
[1,] 1 3  NA
[2,] 2 3  NA
[3,] 2 3  NA
[4,] 5 NA 4
[5,] 7 NA 9
[6,] 8 NA 4
[7,] 8 NA 4

我希望你们中的一些人可以帮助我。这是示例数据,我的实际数据包含一个大型数据库,其中列" X"是"日期+时间" (例如" 2016-12-13 10:40:00 UTC")和c和d列是数量(例如" 40,40")。

非常感谢您的支持。

2 个答案:

答案 0 :(得分:0)

我们将matrix es放在list中,循环浏览lapply),转换为data.tableas.data.table),设置第1列命名为'X',并使用rbindlist来绑定数据集。

library(data.table)
rbindlist(lapply(list(df1, df2), function(x) setnames(as.data.table(x), 1, 'X')), fill=TRUE)
#   X  c  d 
#1: 1  3 NA
#2: 2  3 NA
#3: 2  3 NA
#4: 7 NA  9
#5: 5 NA  4
#6: 8 NA  4
#7: 8 NA  4

答案 1 :(得分:0)

据我所知,你的merge()问题是由于数据的模糊性引起的,例如: df1中的两个相同的行。因此,如果您的数据是作为示例的形式,您可以使用unique()来首先删除重复项并合并最小数据帧:

df_target = data.frame(X = c(df1$a, df2$b))
df_target = merge(x = df_target, y = unique(df1), by.x = "X", by.y = "a", all.x = TRUE)
df_target = merge(x = df_target, y = unique(df2), by.x = "X", by.y = "b", all.x = TRUE)
df_target = df_target[order(df_target$X), ]

或者你取消merge()并显式构造数据框:

df_target2 = data.frame(X = c(df1$a, df2$b),
                        c = c(df1$c, rep(NA, nrow(df2))),
                        d = c(rep(NA, nrow(df1)), df2$d))
df_target2 = df_target2[order(df_target2$X), ]

这可能是最安全的方式,因为它不依赖于假设。