4

42 列と 110,357,407 のマトリックスである大きなデータ フレーム/.csv があります。これは、ポイントの 2 つのデータセット (1 つは 41、もう 1 つは 110,357,407) の x 座標と y 座標から導出されたもので、行の値はこれら 2 つのポイント セット間の距離を表します (リスト 1 の各ポイントからすべての単一ポイントまでの距離)。リスト2)。最初の列はポイントのリストです (1 ~ 110,357,407)。マトリックスからの抜粋を以下に示します。

V1     V2          V3          V4         V5           V6          V7
1   38517.05    38717.8     38840.16    38961.37    39281.06    88551.03    88422.62
2   38514.05    38714.79    38837.15    38958.34    39278       88545.48    88417.09
3   38511.05    38711.79    38834.14    38955.3     39274.94    88539.92    88411.56
4   38508.05    38708.78    38831.13    38952.27    39271.88    88534.37    88406.03
5   38505.06    38705.78    38828.12    38949.24    39268.83    88528.82    88400.5
6   38502.07    38702.78    38825.12    38946.21    39265.78    88523.27    88394.97
7   38499.08    38699.78    38822.12    38943.18    39262.73    88517.72    88389.44
8   38496.09    38696.79    38819.12    38940.15    39259.68    88512.17    88383.91
9   38493.1     38693.8     38816.12    38937.13    39256.63    88506.62    88378.38
10  38490.12    38690.8     38813.12    38934.11    39253.58    88501.07    88372.85
11  38487.14    38687.81    38810.13    38931.09    39250.54    88495.52    88367.33
12  38484.16    38684.83    38807.14    38928.07    39247.5     88489.98    88361.8
13  38481.18    38681.84    38804.15    38925.06    39244.46    88484.43    88356.28
14  38478.21    38678.86    38801.16    38922.04    39241.43    88478.88    88350.75
15  38475.23    38675.88    38798.17    38919.03    39238.39    88473.34    88345.23
16  38472.26    38672.9     38795.19    38916.03    39235.36    88467.8     88339.71

私の問題は、この行列を 3 列だけに変更したいということです。最初の列は、110,357,407 行の行列の最初の列に似ています。最初のポイントから他のすべてのポイントへ)、3 番目はそれらのポイント間の距離になります。したがって、次のようになります

Back   Pres   Dist
1          1        3486
2          1        3456
3          1        3483
4          1        3456
5          1        3429
6          1        3438
7          1        3422
8          1        3427
9          1        3428

(背面とすべての pres の最初の値の間の距離が完了すると、pres は 2 に変わり、最終的には 41 まで進みます)

これは非常にばかげた数の行を出力することを認識していますが、これはRの外にあるいくつかのプロセスを実行するために必要な形式です.

このコードを使ってみました

cols.Output <- data.frame(col = rep(colnames(output3), each = nrow(output3)),           
            row = rep(rownames(output3), ncol(output3)), 
            value = as.vector(output3)) 

しかし、各列に同じ数の行が存在しないため、エラーが発生しました (そして、pres 列のニーズで実際に機能したとは思いません)。rbind.fill および cbind.fill 関数のいくつかを試してみました (plyr のものと、他の人がフォーラムで思いついたもの)。融解と再形成のいくつかも調べましたが、関数について非常に混乱しており、それらを適切に実装する方法がわかりませんでした (または、それらが必要なものに適しているかどうか)。私は長い間苦労してきたので、これについて何か助けていただければ幸いです。

編集:必要なものをもう少し明確にするために。これらの 2 つの小さなデータ セットを取得します。

back <- 5 セットの x、y ポイントを持つ 1 つのデータセット

pres <- 3 セットの x、y ポイントを持つ 1 つのデータセット

これら 2 つのデータ フレーム間の距離を計算すると、初期行列が生成されます。

Back       1         2         3          
1          3427      3444      3451     
2          3432      3486      3476     
3          3486      3479      3486    
4          3449      3438      3484    
5          3483      3486      3486    

そして、私の望ましい出力は次のようになります。

Back        Pres        Dist
1           1           3427
2           1           3432      
3           1           3486      
4           1           3449      
5           1           3483      
1           2           3444      
2           2           3486      
3           2           3479      
4           2           3438      
5           2           3486      
1           3           3451     
2           3           3476     
3           3           3486
4           3           3484   
5           3           3486    
4

2 に答える 2

2

はい、これはパッケージ内のmeltとの組み合わせで一般的に解決される種類の問題のようです。とはいえ、1 億以上の行があるため、この場合、それが最も効率的な方法かどうかはわかりません。castreshape2

次のようにすべて手動で行うことができます。dfデータ フレームの名前は で、距離は列 2 から 42 にあると仮定します。これが機能するかどうかを確認してください。

d <- unlist(df[-1]) # put all the distances into a vector
newdf <- cbind(expand.grid(back=seq_len(nrow(df)), pres=seq_len(ncol(df) - 1)), d)

大量のメモリがない限り、これはおそらく死ぬでしょう。ただし、距離のベクトルには42億を超える要素があるため、単純なソリューションにも同じことが当てはまります。この問題を回避するために、一度に完全なデータセットのサブセットで作業することができます。

于 2013-06-26T18:48:11.650 に答える
1

melt小さな例での使用方法は次のとおりです。

require(reshape2)
a <- matrix(rnorm(9), nrow = 3)
a[, 1] <- 1:3 ## Pretending these are one set of points
rownames(a) <- a[, 1] ## We'll put them as rownames instead of a column
melt(a[, -1]) ## And omit that column when melting

メモリに問題がある場合は、for ループを作成して分割して実行し、完了時にそれぞれをファイルに書き込むことができます。

于 2013-06-26T18:52:41.580 に答える