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

他に必要な情報があれば教えてください、
乾杯、
ロルカン

4

1 に答える 1

1

ff パッケージの ?ffrowapply を見て、行の並べ替えを行います (apply(df,1,sort))

sortdup<-temp1[!duplicated(df.sort),] は、論理値の ff ベクトルに基づいてインデックスを作成できるため、バージョン 0.6 の ffbase パッケージで問題なく動作します。

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 に答える