1


关于 ff 数据帧的另一个问题,但希望这应该是我关于它们的最后一个问题。有一个尴尬的问题,但首先是代码:

fda<-data.frame(c(1,2),c(3,4))
colnames(fda)<-c("col1","col2")
fdb<-data.frame(c(3,7),c(1,5))
colnames(fdb)<-c("col1","col2")
fd<-rbind(fda,fdb)
fd<-data.frame(fd)
library(ff)
library(ffbase)
fd<-as.ffdf(fd)
a<-c(10,12,13,11)
b<-c(13,15,10,14)
fd$col3<-as.ff(a)
fd$col4<-as.ff(b)
fd

该表如下所示:

col1 col2 col3 col4
    1    3   10   13
    2    4   12   15
    3    1   13   10
    7    5   11   14

下面的代码删除了所有重复的行。

rm(fda)
rm(fdb)
fd$dup<-duplicated.ffdf(fd)
fdfin<-subset.ffdf(fd, fd$dup == "FALSE")
fdfin<-as.ffdf(fdfin[,-5])
fdfin

如果您看到第 1 行和第 3 行有点重复,但顺序略有不同。我需要对代码进行排序以使行匹配,然后应用上面的重复代码或一些替代代码来仅删除第 1 行或第 3 行。

这是一个约 12,000,000 行表的小样本,因此我需要使用 ff 或 ffbase 包来执行此操作。

以下适用于普通数据框,所以想知道如何使用 ff 函数来做同样的事情:

df<-temp1[,1:2] #temp1 is a data frame
df.sort<-t(apply(df,1,sort))
sortdup<-temp1[!duplicated(df.sort),]

让我知道是否需要更多信息,
干杯,
Lorcan

4

1 回答 1

1

查看 ff 包中的 ?ffrowapply 以对行进行排序 (apply(df,1,sort))

sortdup<-temp1[!duplicated(df.sort),] 在 ffbase 包的 0.6 版中可以正常工作,因为它允许基于逻辑的 ff 向量进行索引。

要安装 ffbase 0.6 版,请运行以下代码。

download.file(url="http://fffunctions.googlecode.com/git-history/b6fa5617810e012e5d809d77a9a99dbb25c7e6dc/output/ffbase_0.6.tar.gz", destfile="ffbase_0.6.tar.gz")
install.packages("ffbase_0.6.tar.gz", repos=NULL)

如果 ?ffapply 不起作用,您始终可以将此类函数用于问题的应用部分:

ffdfapply <- function(X, MARGIN, FUN, ...){
    ## Currently only handles return types ffdf and ff_vector
    stopifnot(is.ffdf(X))
    xchunks <- chunk(X)
    result <- NULL
    if(MARGIN==1){  
        for (i in xchunks){         
            res.chunk <- apply(X[i, ], MARGIN=1, FUN=FUN, ...)
            if(is.data.frame(res.chunk)){
                result <- ffdfappend(result, res.chunk)
            }else{
                result <- ffappend(result, res.chunk)
            }
    }   
    }else{
        stop("only MARGIN=1 currently allowed")
    }
    result
}
于 2012-08-15T14:52:02.787 回答