Как изменить массив данных с широкого на длинный в J?

#j

#j

Вопрос:

Мне нравится копировать reshape функцию в J.

Например, Stata может reshape изменять набор данных «из широкого в длинный». Ниже приведен их пример 1 из их документации:

 . use http://www.stata-press.com/data/r11/reshape1.dta

. list
   ------------------------------------------------------- 
  | id   sex   inc80   inc81   inc82   ue80   ue81   ue82 |
  |-------------------------------------------------------|
  |  1     0    5000    5500    6000      0      1      0 |
  |  2     1    2000    2200    3300      1      0      0 |
  |  3     0    3000    2000    1000      0      0      1 |
   ------------------------------------------------------- 

. reshape long inc ue, i(id) j(year)

. list
   ----------------------------- 
  | id   year   sex    inc   ue |
  |-----------------------------|
  |  1     80     0   5000    0 |
  |  1     81     0   5500    1 |
  |  1     82     0   6000    0 |
  |  2     80     1   2000    1 |
  |  2     81     1   2200    0 |
  |  2     82     1   3300    0 |
  |  3     80     0   3000    0 |
  |  3     81     0   2000    0 |
  |  3     82     0   1000    1 |
   ----------------------------- 
 

ПРИМЕЧАНИЕ. Python Pandas имеет аналогичную функцию («стек«).

Я понимаю, что J может импортировать файлы данных (формат csv) следующим образом.

 load 'web/gethttp'
] dataset =: gethttp 'https://bbbyc.github.io/reshape1.csv'

load 'tables/csv'
] dataInJArray =: fixcsv dataset

 

Я потерялся после получения этого dataInJArray . Как я могу изменить его? Цените любые подсказки / советы!

Комментарии:

1. Я думаю, вы, вероятно, захотите взглянуть на jd, который находится в addons / data / jd после того, как вы загрузили его через менеджер пакетов. Вы смотрели на это или это упражнение, которое вы хотите выполнить самостоятельно в качестве возможности обучения?

2. Спасибо, Боб. Можете ли вы указать мне на функцию jd? Я просмотрел учебные пособия по jd и вижу некоторые SQL-подобные функции (например, фильтр, упорядочение, вставка, удаление, инструменты администрирования, чтение из CSV), но я не вижу функции для изменения формы. Изначально я надеялся использовать базовую библиотеку J ( transpose вместе с некоторым «groupby»), чтобы воспроизвести приведенный выше пример изменения формы Stata, но я не могу найти что-то, что сработало бы.

3. Если вы видели учебные пособия, то я думаю, что вы видели много документации. Есть эта ссылка code.jsoftware.com/wiki/Jd/Overview и вы всегда можете открыть фактические скрипты / дополнения / данные / jd / jd.ijs, чтобы увидеть определения.

Ответ №1:

Чтобы на самом деле работать над вашей конкретной проблемой, используя J, вы могли бы сделать это:

 NB. t is the data to be stacked:

   [ t=: 3 8 $ 1 0 5000 5500 6000 0 1 0   2 1 2000 2200 3300 1 0 0   3 0 3000 2000 1000 0 0 1 
1 0 5000 5500 6000 0 1 0
2 1 2000 2200 3300 1 0 0
3 0 3000 2000 1000 0 0 1
 

вы можете соответствующим образом выбирать и комбинировать разные столбцы

    ({. ,. 1amp;{ ,. (2 3 4 amp; {),. (5 6 7 amp; {))"1 t
1 0 5000 0
1 0 5500 1
1 0 6000 0

2 1 2000 1
2 1 2200 0
2 1 3300 0

3 0 3000 0
3 0 2000 0
3 0 1000 1
 

Поскольку это оставляет пробелы между группами, вы применяете ,/ их ко всему результату

    ,/@:(({. ,. 1amp;{ ,. (2 3 4 amp; {),. (5 6 7 amp; {))"1) t
1 0 5000 0
1 0 5500 1
1 0 6000 0
2 1 2000 1
2 1 2200 0
2 1 3300 0
3 0 3000 0
3 0 2000 0
3 0 1000 1
 

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

Чтобы завершить форматирование и введение «лет»

    [s1=. ,. each <"1  |: s0  NB. years inserted in the next step
 - - ---- - 
|1|0|5000|0|
|1|0|5500|1|
|1|0|6000|0|
|2|1|2000|1|
|2|1|2200|0|
|2|1|3300|0|
|3|0|3000|0|
|3|0|2000|0|
|3|0|1000|1|
 - - ---- - 
   [s2=. ({. , ,.@:(9 $ 80 81 82"_); }.)s1  NB. 80 81 82"_ creates a verb that returns 80 81 82 given any argument
 - -- - ---- - 
|1|80|0|5000|0|
|1|81|0|5500|1|
|1|82|0|6000|0|
|2|80|1|2000|1|
|2|81|1|2200|0|
|2|82|1|3300|0|
|3|80|0|3000|0|
|3|81|0|2000|0|
|3|82|0|1000|1|
 - -- - ---- - 
   ('id';'year';'sex';'inc';'ue'),:s2
 -- ---- --- ---- -- 
|id|year|sex|inc |ue|
 -- ---- --- ---- -- 
|1 |80  |0  |5000|0 |
|1 |81  |0  |5500|1 |
|1 |82  |0  |6000|0 |
|2 |80  |1  |2000|1 |
|2 |81  |1  |2200|0 |
|2 |82  |1  |3300|0 |
|3 |80  |0  |3000|0 |
|3 |81  |0  |2000|0 |
|3 |82  |0  |1000|1 |
 -- ---- --- ---- --