我有以下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")。
非常感谢您的支持。
答案 0 :(得分:0)
我们将matrix
es放在list
中,循环浏览lapply
),转换为data.table
(as.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), ]
这可能是最安全的方式,因为它不依赖于假设。