【问题标题】:How to reshape data array from wide to long in J?如何在J中将数据数组从宽到长重塑?
【发布时间】:2020-12-03 01:19:54
【问题描述】:

我喜欢在J 中复制reshape 函数。

例如,Stata 可以reshape 一个数据集“从宽到长”。下面是他们documentation的示例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 也有类似的功能(“stack”)。

我了解J可以导入数据文件(csv格式)如下。

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

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

得到这个dataInJArray后我迷路了。我该如何重塑它?感谢任何提示/建议!

【问题讨论】:

  • 我想你可能想在通过包管理器上传它之后查看 addons/data/jd 中的 jd。您是否看过这个练习,或者这是您希望作为学习机会独立完成的练习?
  • 谢谢,鲍勃。你能指出我的jd函数吗?我查看了jd tutorials,我看到了一些类似 SQL 的函数(例如,过滤器、排序、插入、删除、管理工具、从 CSV 读取),但我没有看到用于重塑的函数。最初,我希望使用 J 基础库(transpose,以及一些“groupby”)来复制上述 Stata 的 reshape 示例,但我找不到可行的方法。
  • 如果您看过教程,那么我认为您已经看过很多文档。有这个链接code.jsoftware.com/wiki/Jd/Overview,您可以随时打开实际脚本 /addons/data/jd/jd.ijs 来查看定义。

标签: j


【解决方案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

您可以适当地选择和组合不同的列

   ({. ,. 1&{ ,. (2 3 4 & {),. (5 6 7 & {))"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

由于这会在组之间留下间隙,因此您将,/ 应用于整个结果

   ,/@:(({. ,. 1&{ ,. (2 3 4 & {),. (5 6 7 & {))"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 |
+--+----+---+----+--+

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2012-12-01
    • 2011-01-16
    相关资源
    最近更新 更多