2013-05-27 1 views

ответ

21

В псевдо терминах SQL, что вы пытаетесь сделать, это:

SELECT COUNT(book) 
GROUP BY author, month 

Я так подходить к этому типу проблемы является «группа» поля вместе в одном измерении. Поэтому в вашем случае я объединил бы информацию месяца и автора вместе в измерение.

Пусть это будет наш тест данные:

var cf = crossfilter([ 
{ date:"1 jan 2014", author: "Mr X", book: "Book 1" }, 
{ date:"2 jan 2014", author: "Mr X", book: "Book 2" }, 
{ date:"3 feb 2014", author: "Mr X", book: "Book 3" }, 
{ date:"1 mar 2014", author: "Mr X", book: "Book 4" }, 
{ date:"2 apr 2014", author: "Mr X", book: "Book 5" }, 
{ date:"3 apr 2014", author: "Mr X", book: "Book 6"}, 
{ date:"1 jan 2014", author: "Ms Y", book: "Book 7" }, 
{ date:"2 jan 2014", author: "Ms Y", book: "Book 8" }, 
{ date:"3 jan 2014", author: "Ms Y", book: "Book 9" }, 
{ date:"1 mar 2014", author: "Ms Y", book: "Book 10" }, 
{ date:"2 mar 2014", author: "Ms Y", book: "Book 11" }, 
{ date:"3 mar 2014", author: "Ms Y", book: "Book 12" }, 
{ date:"4 apr 2014", author: "Ms Y", book: "Book 13" } 
]); 

Размерность определяется следующим образом:

var dimensionMonthAuthor = cf.dimension(function (d) { 
    var thisDate = new Date(d.date); 
    return 'month='+thisDate.getMonth()+';author='+d.author; 
}); 

И теперь мы можем просто сделать сверток количества, чтобы подсчитать, сколько книг есть в автор, в месяц (т.е. на единицу измерения):

var monthAuthorCount = dimensionMonthAuthor.group().reduceCount(function (d) { return d.book; }).all(); 

И результаты следующие:

{"key":"month=0;author=Mr X","value":2} 
{"key":"month=0;author=Ms Y","value":3} 
{"key":"month=1;author=Mr X","value":1} 
{"key":"month=2;author=Mr X","value":1} 
{"key":"month=2;author=Ms Y","value":3} 
{"key":"month=3;author=Mr X","value":2} 
{"key":"month=3;author=Ms Y","value":1} 
4

Я не нашел приемлемый ответ на все полезные.

Вместо этого я использовал следующее.

я первый сделал шпоночную группу (в вашем случае месяц)

var authors = cf.dimension(function (d) { 
    return +d['month']; 
    }) 

Далее я использовал карту метода сокращения на шпоночном наборе данных для вычисления средних

группирования вспомогательной функции:

var monthsAvg = authors.group().reduce(reduceAddbooks, reduceRemovebooks, reduceInitialbooks).all(); 

Карта-свертка функции:

function reduceAddbooks(p, v) { 
    p.author = v['author']; 
    p.books = +v['books']; 
    return p; 
} 

function reduceRemovebooks(p, v) { 
    p.author = v['author']; 
    p.books = +v['books']; 
    return p; 
} 

function reduceInitialbooks() { 
    return { 
     author:0, 
     books:0 
    }; 
} 
3

Я хочу, чтобы обновить старый ответ с новой работой вокруг описанной в: https://github.com/dc-js/dc.js/pull/91

Эта работа не была опробована на больших наборов данных

var cf = crossfilter([ 
    { date:"1 jan 2014", author: "Mr X", book: "Book 1" }, 
    { date:"2 jan 2014", author: "Mr X", book: "Book 2" }, 
    { date:"3 feb 2014", author: "Mr X", book: "Book 3" }, 
    { date:"1 mar 2014", author: "Mr X", book: "Book 4" }, 
    { date:"2 apr 2014", author: "Mr X", book: "Book 5" }, 
    { date:"3 apr 2014", author: "Mr X", book: "Book 6"}, 
    { date:"1 jan 2014", author: "Ms Y", book: "Book 7" }, 
    { date:"2 jan 2014", author: "Ms Y", book: "Book 8" }, 
    { date:"3 jan 2014", author: "Ms Y", book: "Book 9" }, 
    { date:"1 mar 2014", author: "Ms Y", book: "Book 10" }, 
    { date:"2 mar 2014", author: "Ms Y", book: "Book 11" }, 
    { date:"3 mar 2014", author: "Ms Y", book: "Book 12" }, 
    { date:"4 apr 2014", author: "Ms Y", book: "Book 13" } 
    ]); 

    var dimensionMonthAuthor = cf.dimension(function (d) { 
    var thisDate = new Date(d.date); 
    //stringify() and later, parse() to get keyed objects 
    return JSON.stringify ({ date: thisDate.getMonth() , author: d.author }) ; 
    }); 

    group = dimensionMonthAuthor.group(); 
    //this forEach method could be very expensive on write. 
    group.all().forEach(function(d) { 
    //parse the json string created above 
    d.key = JSON.parse(d.key); 
    }); 

    return group.all() 

Результаты в:

[ { key: { date: 0, author: 'Mr X' }, 
    value: 2 }, 
    { key: { date: 0, author: 'Ms Y' }, 
    value: 3 }, 
    { key: { date: 1, author: 'Mr X' }, 
    value: 1 }, 
    { key: { date: 2, author: 'Mr X' }, 
    value: 1 }, 
    { key: { date: 2, author: 'Ms Y' }, 
    value: 3 }, 
    { key: { date: 3, author: 'Mr X' }, 
    value: 2 }, 
    { key: { date: 3, author: 'Ms Y' }, 
    value: 1 } ] 
Смежные вопросы