2013-12-16 25 views
2

设二ffdf文件:如何列绑定两个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

没有加载到内存中结合...?那究竟是什么样子? –

+0

@RicardoSaporta我不知道。我可以用ff对象做其他事情,而不需要将原始的完整数据帧加载到内存中,所以我认为'cbind'也可能是可能的。 – user2763361

回答

3

您可以使用下面的结构cbind.ffdf2,确保两个输入ffdf“的列名s的不重复:

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

优雅的解决方案。如果您要求将其纳入ffbase,请在https://github.com/edwindj/ffbase/issues发布功能请求 – jwijffels

+0

谢谢。似乎无法找到“新功能”类别。增强? – Audrey

+0

单击“新问题”并将其标记为增强 – jwijffels

2

对不起,我加入这个迟到。如果你想要绑定任意数量的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对象。