Свертывание возвращает неопределенный или массив со значением при использовании карты - PullRequest
0 голосов
/ 17 апреля 2019

В настоящее время я работаю с довольно большим набором данных, поэтому я стремлюсь уменьшить переменную данных, вложив данные в новую переменную nested_data.

Вот данные, которые я использую:

Landen,"Perioden","SITC","Onderwerpen_1","Waarde eenheid","Waarde"
Afghanistan,"2012","0 Voeding en levende dieren","Invoerwaarde","mln euro","1"
Afghanistan,"2012","1 Dranken en tabak","Invoerwaarde","mln euro","0"
Afghanistan,"2012","2 Grondstoffen niet eetbaar behalve...","Invoerwaarde","mln euro","."
Afghanistan,"2012","3 Minerale brandstoffen smeermiddele...","Invoerwaarde","mln euro","."
Afghanistan,"2012","4 Dierlijke en plantaardige oliën en ...","Invoerwaarde","mln euro","."
Afghanistan,"2012","5 Chemische producten","Invoerwaarde","mln euro","0"
Afghanistan,"2012","6 Fabricaten hoofdzakelijk gerangschi...","Invoerwaarde","mln euro","0"
Afghanistan,"2012","7 Machines en vervoermaterieel","Invoerwaarde","mln euro","1"
Afghanistan,"2012","8 Diverse gefabriceerde goederen","Invoerwaarde","mln euro","1"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","0"

Я хочу, чтобы это было результатом накопления:

[
{
  "key": "0 Voeding en levende dieren",
  "value": 1
},
{
  "key": "1 Dranken en tabak",
  "value": 0
},
{
  "key": "2 Grondstoffen niet eetbaar behalve...",
  "value": 7
},
{
  "key": "3 Minerale brandstoffen smeermiddele...",
  "value": 1
},
{
  "key": "4 Dierlijke en plantaardige oliën en ...",
  "value": 9
},
{
  "key": "5 Chemische producten",
  "value": 4
},
{
  "key": "6 Fabricaten hoofdzakelijk gerangschi...",
  "value": 12
},
{
  "key": "7 Machines en vervoermaterieel",
  "value": 3
},
{
  "key": "8 Diverse gefabriceerde goederen",
  "value": 0
},
{
  "key": "9 Niet afzonderlijk genoemde goederen",
  "value": 13
}
]

Я пробовал использовать накопительный пакет d3 следующим образом:

.rollup(function(d){
    return d.Waarde;
})

Это имеет следующий результат:

result1

Моя вторая попытка использовала «карту», ​​как показано ниже:

.rollup(function(value){
        return value.map(function(d){
            return d.Waarde;
        })
   })

Мне понравился этот результат намного лучше, но это все еще не то, что я ищу:

result2

Хотя этот метод добавляет правильное значение к объекту, он помещает его в массив (что, очевидно, делает «map»). Однако я бы хотел, чтобы оно не помещало значение в массив, а просто как значение ключа.

1 Ответ

2 голосов
/ 17 апреля 2019

В вашем методе rollup этот первый аргумент ...

.rollup(function(d){
    return d.Waarde;
})

... не является объектом: вместо этого это массив.Таким образом, вы почти правильно поняли, когда использовали map ...

.rollup(function(value){
    return value.map(function(d){
        return d.Waarde;
    })
})

... но проблема в том, что map вернет массив, а это не то, что вам нужно.Вы хотите сумму:

.rollup(function(d) {
    return d3.sum(d, function(e) {
        return e.Waarde
    });
})

Вот демонстрация с некоторыми изменениями в ваших данных (у вас есть "." в качестве значения в некоторых строках, что здесь не имеет большого смысла):

const csv = `Landen,"Perioden","SITC","Onderwerpen_1","Waarde eenheid","Waarde"
Afghanistan,"2012","0 Voeding en levende dieren","Invoerwaarde","mln euro","1"
Afghanistan,"2012","1 Dranken en tabak","Invoerwaarde","mln euro","0"
Afghanistan,"2012","2 Grondstoffen niet eetbaar behalve...","Invoerwaarde","mln euro","4"
Afghanistan,"2012","3 Minerale brandstoffen smeermiddele...","Invoerwaarde","mln euro","2"
Afghanistan,"2012","4 Dierlijke en plantaardige oliën en ...","Invoerwaarde","mln euro","7"
Afghanistan,"2012","5 Chemische producten","Invoerwaarde","mln euro","0"
Afghanistan,"2012","6 Fabricaten hoofdzakelijk gerangschi...","Invoerwaarde","mln euro","0"
Afghanistan,"2012","7 Machines en vervoermaterieel","Invoerwaarde","mln euro","1"
Afghanistan,"2012","8 Diverse gefabriceerde goederen","Invoerwaarde","mln euro","1"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","0"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","5"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","2"
Afghanistan,"2012","9 Niet afzonderlijk genoemde goederen","Invoerwaarde","mln euro","9"`;

const data = d3.csvParse(csv, d3.autoType);

const nest = d3.nest()
  .key(function(d) {
    return d.SITC
  })
  .rollup(function(d) {
    return d3.sum(d, function(e) {
      return e.Waarde
    });
  })
  .entries(data)

console.log(nest)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
...