如何列绑定两个ffdf

时间:2013-12-16 02:58:57

标签: r memory-management bigdata ff

假设有两个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而且作者放弃了它,所以我重新发布。

2 个答案:

答案 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对象。