在R中的ffdf数据帧中排序和删除重复项

时间:2012-08-15 12:49:12

标签: r


关于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),]

如果还有其他信息需要,请告诉我 干杯,
洛坎

1 个答案:

答案 0 :(得分:1)

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

sortdup&lt; -temp1 [!duplicated(df.sort),]在ffbase软件包的0.6版本中可以正常工作,因为它允许根据逻辑的ff向量进行索引。

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

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
}