safety-results-over-time
Version:
Chart showing population averages for lab measures, vital signs and other related measures during the course of a clinical trial.
49 lines (43 loc) • 1.77 kB
JavaScript
import { set, ascending } from 'd3';
export default function defineVisitOrder() {
let visits, visitOrder;
//Given an ordering variable sort a unique set of visits by the ordering variable.
if (
this.config.time_settings.order_col &&
this.raw_data[0].hasOwnProperty(this.config.time_settings.order_col)
) {
//Define a unique set of visits with visit order concatenated.
visits = set(
this.raw_data.map(
d =>
`${d[this.config.time_settings.order_col]}|${
d[this.config.time_settings.value_col]
}`
)
).values();
//Sort visits.
visitOrder = visits
.sort((a, b) => {
const aOrder = a.split('|')[0],
bOrder = b.split('|')[0],
diff = +aOrder - +bOrder;
return diff ? diff : ascending(a, b);
})
.map(visit => visit.split('|')[1]);
} else {
//Otherwise sort a unique set of visits alphanumerically.
//Define a unique set of visits.
visits = set(this.raw_data.map(d => d[this.config.time_settings.value_col])).values();
//Sort visits;
visitOrder = visits.sort();
}
//Set x-axis domain.
if (this.config.time_settings.order) {
//If a visit order is specified, use it and concatenate any unspecified visits at the end.
this.config.x.order = this.config.time_settings.order.concat(
visitOrder.filter(visit => this.config.time_settings.order.indexOf(visit) < 0)
);
}
//Otherwise use data-driven visit order.
else this.config.x.order = visitOrder;
}