如何使用d3.js透视表?

如何使用d3.js透视表?,d3.js,pivot-table,D3.js,Pivot Table,考虑以下表格数据(只是一个示例): 请注意,A、B、C和D列的不同值组合在此表中仅出现一次。因此,可以将此列子集视为“关键列”,其余列视为“值列” 假设此数据位于某个文件data.csv中,我们将此文件与d3.csv一起读入回调参数data,如下所示: d3.csv('data.csv', function (error, data) { ... }); 我正在寻找一种方便的d3.js操作来转换数据,从而使C列“旋转”。我的意思是,转换表的“值”列是通过将C列的值与原始“值”列、x、y

考虑以下表格数据(只是一个示例):

请注意,
A
B
C
D
列的不同值组合在此表中仅出现一次。因此,可以将此列子集视为“关键列”,其余列视为“值列”

假设此数据位于某个文件
data.csv
中,我们将此文件与
d3.csv
一起读入回调参数
data
,如下所示:

d3.csv('data.csv', function (error, data) {
    ...
});
我正在寻找一种方便的
d3.js
操作来转换
数据
,从而使
C
列“旋转”。我的意思是,转换表的“值”列是通过将
C
列的值与原始“值”列、
x
y
z
进行“交叉”而获得的。换句话说,在csv格式中,转换后的表如下所示:

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
如果没有简单的方法可以做到这一点,一个更简单(但仍然有用)的变体是在首先丢弃除一个“value”列之外的所有列之后进行类似的转换。例如,在丢弃
x
y
列后,旋转
C
列将产生(csv格式):

简化之处在于,现在可以简单地将原始值列(
z
)替换为一组列,这些列以旋转(
C
)的列中的值(
c0
c1
)命名。

您正在查找:

d3.csv('data.csv',函数(数据){
var nester=d3.nest()
.key(函数(d){返回d.A;})
.key(函数(d){返回d.B;})
.key(函数(d){返回d.d;})
.rollup(函数(值){
var sortedValues=values.sort(函数(x,y){
返回x.Cy.C-1:0;
});
var mkKey=函数(c,name,v){
返回{
名称:'C_'+C+'+name,
值:v
};
}
var pivotedX=sortedValues.map(函数(d){return mkKey(d.C,'x',d.x);}),
pivotedY=sortedValues.map(函数(d){返回mkKey(d.C,'y',d.y);}),
pivotedZ=sortedValues.map(函数(d){返回mkKey(d.C,'z',d.z);});
返回Array.prototype.concat.apply([],[pivotedX,pivotedY,pivotedZ]);
});
var nestedData=nester.entries(数据);
var pivotedData=[];
forEach(函数(kv1){
var a=kv1.key;
kv1.values.forEach(函数(kv2){
var b=kv2.key;
kv2.values.forEach(函数(kv3){
var d=kv3.key;
var obj={
A:A,
B:B,
D:D
};
kv3.values.forEach(函数(d){
obj[d.name]=d.value;
})
旋转数据推送(obj);
})
})
})  
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”
}
]

请看
script.js
控制台上的输出

对不起,一定是有什么误解,因为这与我要找的还不太接近……抱歉。错误在于忽略了您需要数据的确切形式,我假设您只需要在
C
列上添加
groupby
。我已经用正确的解决方案更新了答案:@lividd您正在查看控制台输出吗?
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
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