Фильтрация многомерных данных - PullRequest
1 голос
/ 03 августа 2020

У меня есть файл TestF.csv, содержащий следующие строки.

id,D1,D2,D3,D4,D5,D6,D7
1,9.44,9.32,8.52,7.52,8.19,10.07,10.86
2,-1.89,-4.41,-3.06,3.65,5.95,9.07,10.99
3,9.36,7.51,7.68,7.33,6.7,8.84,45.31
4,6.36,6.51,7.8,8.53,7.7,8.9,35.0

Я хотел бы отфильтровать строки, для которых значения от D1 до D7 находятся в заданном диапазоне c. Например, для 5 <значение <40 строки, возвращаемые кодом: </p>

id,D1,D2,D3,D4,D5,D6,D7
1,9.44,9.32,8.52,7.52,8.19,10.07,10.86
4,6.36,6.51,7.8,8.53,7.7,8.9,35.0

Следующий код работает, но он проверяет значение D1, только если оно находится в диапазоне, но не другие значения .

queue()
     .defer(d3.csv,"data/TestF.csv")
    .await(ready);

    test.forEach(function(d) {
    for (var i = 0, n = 8, c; i < n; ++i) {
        d[c = columns[i]] = +d[c];
    }
    });

    testFiltered = test.filter(function(d) {
    for (var i = 1, n = 8, c; i < n; ++i) {
        return (d[c = columns[i]] >= 5 && d[c = columns[i]] <= 40);
    }
})

Какие изменения приведут к тому, что код заработает? Спасибо.

1 Ответ

0 голосов
/ 03 августа 2020

Используйте функцию преобразования строк (в вашем случае в методе defer, который содержит d3.csv). Это может быть просто:

const row = (d, _, columns) => columns.slice(1).every(e => d[e] > 5 && d[e] < 40) ? d : null;

Как видите, мы получаем все столбцы, кроме первого (slice(1)), и тестируем их с вашими значениями, возвращая объект (d), если они проходят .

Вот демонстрация:

const csv = `id,D1,D2,D3,D4,D5,D6,D7
1,9.44,9.32,8.52,7.52,8.19,10.07,10.86
2,-1.89,-4.41,-3.06,3.65,5.95,9.07,10.99
3,9.36,7.51,7.68,7.33,6.7,8.84,45.31
4,6.36,6.51,7.8,8.53,7.7,8.9,35.0`;

const row = (d, i, columns) => columns.slice(1).every(e => d[e] > 5 && d[e] < 40) ? d : null;

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

console.log(data);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...