code: function arffToInputs(arffData, targetAttributes, patternAttributes, options = {}) {
    // set the target to the last attribute if no target attributes are given
    if (!Array.isArray(targetAttributes) || targetAttributes.length === 0) {
      targetAttributes = [arffData.attributes[arffData.attributes.length - 1]];
    }
    // get all the columns that represent the targets and place them in one place
    let targetColumns = targetAttributes.map((attribute) => {
      return arffData.data.map((dataRow) => {
        return dataRow[attribute];
      });
    });
    
    // set the patternAttributes to all
    if (!Array.isArray(patternAttributes) || patternAttributes.length === 0) {
      patternAttributes = arffData.attributes;
    }
    if (!options.skipTargetFilter) {
      // filter out the target attributes to get the input attributes
      patternAttributes = patternAttributes.filter((attribute) => {
        return targetAttributes.indexOf(attribute) === -1;
      });
    }
    
    // grab all the input attributes out of each data row to form the set of inputs/patterns
    let patterns = arffData.data.map((dataRow) => {
      return patternAttributes.map((attribute) => {
        return dataRow[attribute];
      });
    });
    
    return {
      targetColumns: targetColumns,
      patterns: patterns,
      patternAttributes: patternAttributes,
      targetAttributes: targetAttributes
    };
  }
docs: options: skipTargetFilter = true: don't filter out target attributes from input attributes. I don't know why you'd want to do this.