假设有两个ffdf
个文件:
library(ff)
ff1 <- as.ffdf(data.frame(matrix(rnorm(10*10),ncol=10)))
ff2 <- ff1
colnames(ff2) <- 1:10
如何在不将它们加载到内存中的情况下对列进行绑定? cbind
不起作用。
有同样的问题http://stackoverflow.com/questions/18355686/columnbind-ff-data-frames-in-r
,但它没有MWE而且作者放弃了它,所以我重新发布。
答案 0 :(得分:3)
您可以使用以下构造cbind.ffdf2
,确保两个输入ffdf
的列名不重复:
library(ff)
ff1 <- as.ffdf(data.frame(letA = letters[1:5], numA = 1:5))
ff2 <- as.ffdf(data.frame(letB = letters[6:10], numB = 6:10))
cbind.ffdf2 <- function(d1, d2){
D1names <- colnames(d1)
D2names <- colnames(d2)
mergeCall <- do.call("ffdf", c(physical(d1), physical(d2)))
colnames(mergeCall) <- c(D1names, D2names)
mergeCall
}
cbind.ffdf2(ff1, ff2)[,]
结果:
letA numA letB numB
1 a 1 f 6
2 b 2 g 7
3 c 3 h 8
4 d 4 i 9
5 e 5 j 10
答案 1 :(得分:2)
很抱歉加入这个晚了。如果你想要cbind任意数量的ffdf对象而不必担心重复的列。你可以尝试这个(基于Audrey的解决方案)。
ff1 <- as.ffdf(data.frame(letA = letters[1:5], numA = 1:5))
ff2 <- as.ffdf(data.frame(letA = letters[6:10], numB = 6:10))
cbind.ffdf2 <- function(...){
argl <- list(...)
if(length(argl) == 1L){
return(argl[[1]])
}else{
physicalList = NULL
for(i in 1:length(argl)){
if(class(argl[[i]]) == "data.frame"){
physicalList = c(physicalList, physical(as.ffdf(argl[[i]])))
}else{
physicalList = c(physicalList, physical(argl[[i]]))
}
}
mergeCall <- do.call("ffdf", physicalList)
return(mergeCall)
}
}
cbind.ffdf2(ff1, ff2)
它还将列表中的任何数据框对象粗化为ffdf对象。