-1

大きな .csv ファイルがあります。そのファイルを新しいテーブルにフィルター処理したいと思います。

たとえば、次のような .csv ファイルがあります。

   f1 f2  f3 f4  f5  f6 f7 f9  f10  f11 
t1  1  0  1   0  1  0   0  0   0    1 
t2  1  0  0   0  0  1   1  1   1    1 
t3  0  0  0   0  0  0   0  0   0    0 
t4  1  0  0   0  1  0   0  0   0    0 
t5  0  0  0   0  0  0   0  0   0    0 
t6  0  0  0   0  0  0   0  0   0    0 
  1. 私はテーブルを持っています(上記のように)

  2. 私がやりたいことは、各行に新しいテーブルを作成したいということです (つまり、すべての行に新しいテーブルを作成します。たとえば、行 t1 に新しいテーブル、行 t2 に新しいテーブル、行 t3 に新しいテーブルなど)。 )。この例のように、6 つの新しいテーブルが必要です。

  3. 行ごとに新しいテーブルを作成するには、満たす必要がある条件があります。新しいテーブルは、各列のすべての値を確認する必要があります。また、列の値が他の行の他の列と同じ値 (値 1) の場合は、グループ化する必要があります。

この例のように、t1 の新しいテーブルは t1、t2、t4 で構成されます。列 f1 の値は、行 t2 および t4 の f1 の値と同じ値 (1) を持ち、f5 の値も値と等しいためです。行 t4 の f5 の値、および f11 の値は行 t2 の f11 の値と等しい)。つまり、すべての列をチェックします。の出力の 1 つは次のようになります。

       f1 f2  f3 f4  f5  f6 f7 f9  f10  f11 
    t1  1  0  1   0  1  0   0  0   0    1 
    t2  1  0  0   0  0  1   1  1   1    1 
    t4  1  0  0   0  1  0   0  0   0    0 
  1. t2 については、t1 の f1 の値と t4 の f1 の値が等しいため、行 t2 は t4 とグループ化する必要があります。ただし、t2 は前の行を考慮すべきではありません (この例のように、t1 を考慮すべきではありません)。出力は次のようになります。

      f1 f2  f3 f4  f5  f6 f7 f9  f10  f11 
    t2  1  0  0   0  0  1   1  1   1    1 
    t4  1  0  0   0  1  0   0  0   0    0 
    
  2. 他の行 (行 t3、t4、t5、および t6) と同様に、各列のすべての値を確認する必要があります。また、列の値が他の行の他の列と同じ値 (値 1) の場合は、グループ化する必要があります。

  3. 次に、新しいテーブル (行と列のヘッダーを含む) を新しい .csv ファイルに保存する必要があります。行名を使用してファイルの名前を変更する必要があります。たとえば、t1 については、t1.csv として保存する必要があります。

  4. これは単純な例にすぎません。ここで提案されたソリューションは、他の大きなデータ テーブルに適用されます。abc.csv ファイルを読み取る必要があります。つまり、100 以上の新しいテーブルが作成される可能性があります (元のデータを使用した場合)。

これまでのところ、私はこのコードを使用しました:

a.files <- grep("^Task_vs_Files", dir(), value=TRUE) 
a.files

for(i in 1:length(a.files))
   dat <- read.table(file=a.files[i], header=T, sep=",", row.names=1) 


      (sapply(1:nrow(dat), function(x) if (dat[x,]==1)  #check row
            (sapply(1:nrow(dat), function(y) if (dat[,y]==1) #check column

            { 
                   write.csv( dat[(dat[[x,y]]==1 ) & (1:nrow(dat) >= x) , ] , file = paste("Files_", x) ) #save file based on row names
            } 
            else {NULL} ))

a.files からの出力:

[1] "Task_vs_Files_Proj.csv"  "Task_vs_Files_Whirr.csv"

ファイルの 1 つからのデータセット (Task_vs_Files_Proj.csv)

       pom.xml. ZooKeeper.java HBase.java Hadoop.java. BasicServer.java. Abstract.java. HBaseRegion.java
WHIRR-25        1              0          1            0                 1              1                1
WHIRR-28        1              0          1            0                 0              1                0
WHIRR-55        0              0          1            0                 0              0                0
WHIRR-61        0              0          0            0                 0              1                0
WHIRR-76        0              0          1            0                 0              0                0
WHIRR-87        1              1          1            0                 0              1                1
WHIRR-92        1              0          0            1                 0              1                1

専門家からの助けに感謝します!

4

1 に答える 1

1
 sapply(1:nrow(dat), function(x) if (dat[x, "f1"]==1) { 
           write.csv( dat[ (dat[["f1"]]==1 )& (1:nrow(dat) >= x) , ])
            } else {NULL} )
"","f1","f2","f3","f4","f5","f6","f7","f9","f10","f11"
"t1",1,0,1,0,1,0,0,0,0,1
"t2",1,0,0,0,0,1,1,1,1,1
"t4",1,0,0,0,1,0,0,0,0,0
"","f1","f2","f3","f4","f5","f6","f7","f9","f10","f11"
"t2",1,0,0,0,0,1,1,1,1,1
"t4",1,0,0,0,1,0,0,0,0,0
"","f1","f2","f3","f4","f5","f6","f7","f9","f10","f11"
"t4",1,0,0,0,1,0,0,0,0,0
[[1]]
NULL

ファイル名を作成する必要があります:

invisible(
  sapply(1:nrow(dat), function(x) if (dat[x, "f1"]==1) { 
           write.csv( dat[ (dat[["f1"]]==1 )& (1:nrow(dat) >= x) , ] ,
                    file = paste0("fil_", x, ".csv") )
                                } else {NULL} )
         )   

これが Excel 用である場合、行名は含まれますが、行名を指定するための列ヘッダーは作成されないことに注意してください。

于 2012-09-17T23:02:28.553 に答える