1

7 つの変数と 1000 行を超える 103 個のデータ フレームがあります。1 つのデータ フレームの 2 つの列のペアが他の 102 データ フレームに出現する回数を調べたいと考えています。つまり、他の 102 個のデータ フレームで何回c(V1,V2)一緒に (= データ フレームの 2 つの列を一緒に) 見ることができるかということです。

すでにコードを書いていますが、非常に遅いです!

103 個すべてのデータ フレームをリストに入れ、データ フレームに変換します。次に、各データ フレームを 1 つずつ読み取る for ループを作成します。各ループには、そのリスト内のデータフレームの各行を検索するための別の for ループがあります!

コードの主要部分は次のとおりです。

    for(i in file){
         input<-read.table(i)

         for(j in 1:1000){
            df1<- data.table(input[j,c(1,3)]) 
            count<-merge(df1,dt, c("V1", "V3")) //dt is a data frame includes all 103 data frames
            df1["count"]<-nrow(count)
       }
    }

このようにして、データフレームの V1 と V3 のセットが他のデータフレームに何回来るかを数えることができます。しかし、すべての結果を得るには 50 日以上かかります。

希望する結果をより迅速に得る方法を誰かが手伝ってくれるのではないかと思います。


データ フレームの例 (ここでは 5 つの変数のみが考慮されます):

 V1    V2  V3   V4  V5 
 1     Q0  abc  34  3
 1     Q0  abd  31  9
 1     Q0  bac  32  3
 1     Q0  cba  56  0
 2     Q0  zxc  37  3
 2     Q0  fgc  30  3
 2     Q0  ghc  36  3

実際、V3 と V1 は依存関係にあるため、V3 の各値が他のデータ フレームに含まれる回数を知りたいと考えています。検索では V1 も考慮する必要があります。c(V1,V3)したがって、他のデータ フレームに何回来るかを確認する必要があります。たとえば (1,abc) 一緒に! または(1、abd)。

dt はデータ フレームと同じ構造ですが、私が持っているすべてのデータ フレームのすべてのデータが含まれています。

4

1 に答える 1

0

回答を試みますが、率直に言って、あなたの問題を理解しているかどうかわかりません。また、私たちが取り組むのに十分なデータを提供していないため、問題の解決策を見つけるのが困難です. しかし、ここに行きます。問題のある行をコメントアウトし、独自の行を使用しました。これでさらにお役に立てれば幸いです。

V=vector("list",length(file))
cnt=1;
for(i in file){
     #input<-read.table(i)

     # Use fread to read the file. It is vert fast
     dt<-fread(i)[,c(1,3), with=FALSE]
     # Create a dummy column which we will sum eventually
     dt[,VAL:=1] #
     #dt<-merge(dt,df1, by=c('V1','V3'),all.x=TRUE)

     # Add in the list-vector to create the big data.table in the end
     V[[cnt]]=dt;
     cnt=cnt+1

 # You don't need a for-loop to merge line by line.
 #for(j in 1:1000){
      #df1<- data.table(input[j,c(1,3)]) 
      #count<-merge(df1,dt, c("V1", "V3")) //dt is a data frame includes all 103 data frames
      #df1["count"]<-nrow(count)
 #}
}

# Create a big data.table
V<-rbindlist(V);

#Aggregate on V1 and V3 and see how many lines are there.
V[,lapply(.SD,sum,na.rm=TRUE),by=c('V1','V3')]

これが役立つことを願っています。それ以外の場合は、どうにかしてファイルのサンプルをアップロードすると、作業が簡単になります。

ありがとう

于 2014-12-18T10:21:15.647 に答える