【发布时间】:2014-02-17 20:01:04
【问题描述】:
我正在尝试通过合并和附加两个现有的 ffdf 数据框来创建一个 ffdf 数据框。 ffdfs 具有不同的列数和不同的行数。我知道merge() 只执行内部和左外部联接,而ffdfappend() 将不允许在列不相同的情况下进行附加。我想知道是否有人对此有解决方法。 gtools package 中的 smartbind() 之类的函数或任何其他解决方法。
当然,由于 ffdfs 的大小,转换回 as.data.frame() 并使用 smartbind() 不是一种选择。
任何帮助将不胜感激。
编辑:根据建议,这里是一个可重现的示例:
require(ff)
require(ffbase)
df1 <- data.frame(A=1:10, B=LETTERS[1:10], C=rnorm(10), G=1 )
df2 <- data.frame(A=11:20, D=rnorm(10), E=letters[1:10], G=1 )
ffdf1 <- as.ffdf(df1)
ffdf2 <- as.ffdf(df2)
所需的结果应该是这样的(在 data.frames 上生成,如果我知道如何在 ffdfs 上生成它,我不会问这个问题):
require(gtools)
dfcombined <- smartbind(df1, df2)
dfcombined
A B C G D E
1:1 1 A 1.1556719 1 NA <NA>
1:2 2 B 0.3279260 1 NA <NA>
1:3 3 C 0.4067643 1 NA <NA>
1:4 4 D -0.9144717 1 NA <NA>
1:5 5 E -0.1138263 1 NA <NA>
1:6 6 F 0.8227560 1 NA <NA>
1:7 7 G 0.3394098 1 NA <NA>
1:8 8 H 1.4498439 1 NA <NA>
1:9 9 I -1.3202419 1 NA <NA>
1:10 10 J 0.2099266 1 NA <NA>
2:1 11 <NA> NA 1 -1.5802636 a
2:2 12 <NA> NA 1 1.2925790 b
2:3 13 <NA> NA 1 1.3477483 c
2:4 14 <NA> NA 1 -1.6760211 d
2:5 15 <NA> NA 1 0.1456295 e
2:6 16 <NA> NA 1 0.4726867 f
2:7 17 <NA> NA 1 -1.5209117 g
2:8 18 <NA> NA 1 0.3407136 h
2:9 19 <NA> NA 1 1.3582868 i
2:10 20 <NA> NA 1 -1.5083929 j
我希望这能让我更清楚我想要实现的目标。
【问题讨论】:
-
@RicardoSaporta 它没有为
ffbase:::merge.ffdf实现。if ((all.x == TRUE & all.y == TRUE) | (all.y == TRUE & all.x == TRUE)) { stop("merge.ffdf only allows inner joins")。这个问题可以使用一个可重现的例子。 -
我将以下内容作为评论发布,因为我无法让它在真实 (1E8) 大小的 ffdf 上运行(更改
nrow导致“无法分配...”错误): 一个技巧是首先合并两个ffdf的一小部分,例如smartmatch。然后调整这个对象的大小以适应ffdf1和ffdf2。将ffdf1复制到该对象的前半部分,将ffdf2复制到后半部分。 (这里是代码示例) -
@Jen van der Laan:这听起来像是一个可行的解决方案,但我看不到代码示例。
-
@Rkook 代码太长,无法添加到评论中。我现在已将其发布为答案,也许它确实在您的对象上运行。
标签: r merge append ffbase large-data