Нормализовать (переформатировать) данные перекрестных таблиц для Tableau без использования Excel

Таблица обычно работает лучше всего, когда входные данные находятся в "нормализованном" формате, а не в перекрестном. Это также называется преобразованием из "широкого формата" в "длинный формат".

То есть, преобразование из:

enter image description here

To:

enter image description here

Tableau предоставляет "инструмент переформатирования" для пользователей Excel, но если у вас нет Excel, вы застряли.

Итак, как вы можете получить таблицу в этом формате без использования Excel?

Ответ 1

Ну, вы можете использовать этот удобный Google Таблицы script, который я сделал.

enter image description here

/*
normalizeCrossTab: Converts crosstab format to normalized form. Given columns abcDE, the user puts the cursor somewhere in column D.
The result is a new sheet, NormalizedResult, like this:

a     b     c    Field Value
a1    b1    c1   D     D1
a1    b1    c1   E     E1
a2    b2    c2   D     D2
a2    b2    c2   E     E2
...

Author: 
Steve Bennett
[email protected]
@stevage1

Licence: Public Domain

*/

function start() {
  var html = HtmlService.createHtmlOutput(
    '<style>ol { padding-left: 1.5em; }</style>' + 
    '<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>' +
    '<script>' + 
    'function allDone(msg) { ' +
    '  $("#normalizeBtn").hide();' +
    '  $("#datacols-output").html("<p>Your normalized data is in a sheet called NormalizedResult. If you run the normalization again, that sheet will be deleted and replaced.</p>");' +
    '};' +
    'function gotCols(cols) { ' + 
    '  $("#datacols-output").html(\'<p>These will be your dependent variables:</p><ul id="datacols"></ul>\'); ' + 
    '  $("#normalizeBtn").show();' +
    '  $.each(cols, function() {' + 
    '    $("#datacols").append($("<li>").text(this)); ' + 
    '  });' + 
    '  $("#datacols").after("<p>If they don\'t look right, move the cursor and press <i>Continue</i>.</p>"); ' + 
    '}' + 
    '</script>' + 
    '<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">' +
    '<h2>Convert cross-tab</h2>'+
    '<p>This macro converts <i>cross-tab</i> data which has multiple dependent variables (eg, observations, sales figures) per row into a <i>normalized</i> format with one dependent variable per row.</p>' + 
    '<p>The name of each dependent variable becomes the value of a new column called <code>Field</code> and its value goes in a column called <code>Value</code>.</p>' +
    '<ol><li>Move <b>all independent variable columns to the left</b></li>' + 
    '    <li>Place the <b>cursor in the first dependent variable column</li></ol>'+
    '<p><button onClick="google.script.run.withSuccessHandler(gotCols).getDataColumns();">Continue</button></p>' + 
    '<p id="datacols-output"></p>' +
    '<p><button id="normalizeBtn" class="create" style="display:none;" onClick="google.script.run.withSuccessHandler(allDone).normalizeCrosstab(true);">Normalize</button></p>' + 
  '<br/><p><a target="_blank" href="http://kb.tableausoftware.com/articles/knowledgebase/denormalize-data">More information</a></p>')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setTitle('Normalize cross-tab')
      .setWidth(300);
  SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
      .showSidebar(html);
}

function onOpen() {
  var ss = SpreadsheetApp.getActive();
  var items = [
    {name: 'Normalize Crosstab', functionName: 'start'},
  ];
  ss.addMenu('Normalize', items);
}


function normalizeCrosstab(really) {
  if (!really) {
    return start();
  }
  var sheet = SpreadsheetApp.getActiveSheet(); 
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var firstDataCol = SpreadsheetApp.getActiveRange().getColumn();
  var dataCols = values[0].slice(firstDataCol-1);

  var resultssheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("NormalizedResult");
  if (resultssheet != null) {
    SpreadsheetApp.getActive().deleteSheet(resultssheet);
  }
  var header = values[0].slice(0, firstDataCol - 1);

  var newRows = [];

  header.push("Field");
  header.push("Value");
  newRows.push(header);

  for (var i = 1; i <= numRows - 1; i++) {
    var row = values[i];
    for (var datacol = 0; datacol < dataCols.length; datacol ++) {
      newRow = row.slice(0, firstDataCol - 1); // copy repeating portion of each row
      newRow.push(values[0][firstDataCol - 1 + datacol]); // field name
      newRow.push(values[i][firstDataCol - 1 + datacol]); // field value
      newRows.push(newRow);
    }
  }
  var newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("NormalizedResult");
  var r = newSheet.getRange(1,1,newRows.length, header.length);
  r.setValues(newRows);
};

function getDataColumns() {  
  var sheet = SpreadsheetApp.getActiveSheet(); 
  var rows = sheet.getDataRange();
  var values = rows.getValues();
  var firstDataCol = SpreadsheetApp.getActiveRange().getColumn();
  var dataCols = values[0].slice(firstDataCol-1);
  return dataCols;

}

Полная запись с инструкциями по установке.

Ответ 2

Более новые версии Tableau (9.0 и выше) позволяют изменять данные по импорту. Это так же просто, как выбор столбцов, которые вы хотите уложить. Здесь полезное руководство.

Некоторые коммерческие инструменты, полезные для переделки и очистки данных, заслуживают изучения:

Trifacta был создан некоторыми людьми, которые работали над предыдущим учебным проектом DataWrangler. Мне сказали, что Alteryx хорош для некоторых задач подготовки к геопространственным данным и встретил некоторых восторженных пользователей Paxata.

У меня слишком мало опыта работы с ними, чтобы дать больше, чем ссылку на их веб-сайты, предпочитая использовать сценарии Python вместо этого.

Если вы хотите "свернуть" столбцы, которые хотите объединить в один столбец. Tableau написал полезный учебник здесь. В таблице 9 были внесены некоторые полезные функции перестройки для раскручивания таблиц и разделения столбцов.

Ответ 3

Если вам удобно использовать командные строки и стиль Unix для объединения небольших инструментов с помощью труб, ознакомьтесь с открытым исходным кодом csvkit toolsuite.

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

Но для перестройки задач вы можете использовать csvcut, чтобы вытащить интересующие столбцы, csvgrep, чтобы вытащить интересующие строки и cvsstack. объединить несколько файлов csv в один длинный, вместе с параметрами -g и -n, чтобы добавить поле группировки.

Есть несколько других полезных команд, и если вы знакомы с Unix или linux, вы можете быстро определить, что они делают, просто из имен команд.