7

次の表形式のデータを考えてみましょう (ほんの一例)。

A,B,C,D,x,y,z
a0,b0,c0,d0,0.007,0.710,0.990
a0,b0,c0,d1,0.283,0.040,1.027
a0,b0,c1,d0,0.017,0.688,2.840
a0,b0,c1,d1,0.167,0.132,2.471
a0,b1,c0,d0,0.041,0.851,1.078
a0,b1,c0,d1,0.235,1.027,1.027
a0,b1,c1,d0,0.037,0.934,2.282
a0,b1,c1,d1,0.023,1.049,2.826
a1,b0,c0,d0,0.912,0.425,1.055
a1,b0,c0,d1,0.329,0.932,0.836
a1,b0,c1,d0,0.481,0.681,0.997
a1,b0,c1,d1,0.782,0.595,2.294
a1,b1,c0,d0,0.264,0.918,0.857
a1,b1,c0,d1,0.053,1.001,0.920
a1,b1,c1,d0,1.161,1.090,1.470
a1,b1,c1,d1,0.130,0.992,2.121

ABC、およびの個別の値の各組み合わせはD、このテーブルで 1 回だけ発生することに注意してください。したがって、この列のサブセットを「キー列」、残りの列を「値列」と考えることができます。

このデータがいくつかのファイルにあり、次のようにこのファイルをコールバック引数にdata.csv読み込むとします。d3.csvdata

d3.csv('data.csv', function (error, data) {
    ...
});

列が「ピボット」されるようd3.jsに変換するための便利な操作を探しています。これにより、変換されたテーブルの「値」列は、列の値を元の「値」列、、、、と「交差」させることによって得られるものであることを意味します。つまり、csv 形式では、変換されたテーブルは次のようになります。dataCCxyz

A,B,D,x_c0,x_c1,y_c0,y_c1,z_c0,z_c1
a0,b0,d0,0.007,0.017,0.710,0.688,0.990,2.840
a0,b0,d1,0.283,0.167,0.040,0.132,1.027,2.471
a0,b1,d0,0.041,0.037,0.851,0.934,1.078,2.282
a0,b1,d1,0.235,0.023,1.027,1.049,1.027,2.826
a1,b0,d0,0.912,0.481,0.425,0.681,1.055,0.997
a1,b0,d1,0.329,0.782,0.932,0.595,0.836,2.294
a1,b1,d0,0.264,1.161,0.918,1.090,0.857,1.470
a1,b1,d1,0.053,0.130,1.001,0.992,0.920,2.121

これを行う簡単な方法がない場合、より単純な (しかし有用な) バリアントは、最初に「値」列を 1 つを残してすべて破棄した後、同様の変換を行うことです。たとえば、列と列を破棄した後xy列をピボットするCと、(csv 形式で) 次のようになります。

A,B,D,c0,c1
a0,b0,d0,0.990,2.840
a0,b0,d1,1.027,2.471
a0,b1,d0,1.078,2.282
a0,b1,d1,1.027,2.826
a1,b0,d0,1.055,0.997
a1,b0,d1,0.836,2.294
a1,b1,d0,0.857,1.470
a1,b1,d1,0.920,2.121

簡略化は、元の値の列 ( )を、ピボットされた列 ( )zの値 (この場合は) にちなんで名付けられた一連の列に単純に置き換えることができることです。c0c1C

4

1 に答える 1

7

あなたが探しているd3.nest

d3.csv('data.csv', function (data) {
  var nester = d3.nest()
    .key(function (d) { return d.A; })
    .key(function (d) { return d.B; })
    .key(function (d) { return d.D; })
    .rollup(function (values) {
       var sortedValues = values.sort(function (x, y) { 
        return x.C < y.C ? -1 : x.C > y.C ? 1 : 0; 
       });
       var mkKey = function (c, name, v) {
         return {
           name: 'C_' + c + '_' + name,
           value: v
         };
       }

       var pivotedX = sortedValues.map(function (d) { return mkKey(d.C, 'x', d.x); }),
           pivotedY = sortedValues.map(function (d) { return mkKey(d.C, 'y', d.y); }),
           pivotedZ = sortedValues.map(function (d) { return mkKey(d.C, 'z', d.z); });

       return Array.prototype.concat.apply([], [pivotedX, pivotedY, pivotedZ]);
    });

  var nestedData = nester.entries(data);
  var pivotedData = [];

  nestedData.forEach(function (kv1) {
    var a = kv1.key;
    kv1.values.forEach(function (kv2) {
      var b = kv2.key;
      kv2.values.forEach(function (kv3) {
        var d = kv3.key;
        var obj = {
          A: a,
          B: b,
          D: d
        };

        kv3.values.forEach(function (d){
          obj[d.name] = d.value;
        })
        pivotedData.push(obj);
      })
    })
  })  
  console.log(JSON.stringify(pivotedData, null, '  '));
});

結果nestedDataは次の形式になります。

[
  {
    "A": "a0",
    "B": "b0",
    "D": "d0",
    "C_c0_x": "0.007",
    "C_c1_x": "0.017",
    "C_c0_y": "0.710",
    "C_c1_y": "0.688",
    "C_c0_z": "0.990",
    "C_c1_z": "2.840"
  },
  ...,
  {
    "A": "a1",
    "B": "b1",
    "D": "d1",
    "C_c0_x": "0.053",
    "C_c1_x": "0.130",
    "C_c0_y": "1.001",
    "C_c1_y": "0.992",
    "C_c0_z": "0.920",
    "C_c1_z": "2.121"
  }
]

Demoscript.jsと の出力を見てくださいconsole

于 2013-11-03T20:36:22.547 に答える