#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 |
-- ---- --- ---- --