执行此操作的标准方法是:
将面向行(单元格)的结构转换为面向列的结构
将正确的动词应用于每一列(仅一次)
步骤(1)很简单。步骤 (2) 也很简单,但不那么明显。有一个小技巧可以帮上忙。
诀窍是知道许多原始运算符接受动名词作为左参数并生成一个函数,该函数在动名词上循环,依次应用每个动词。IMO,该类别中最有用的运算符是;.
. 这是使用它的示例实现:
步骤(0),输入:
matrix =: ('abc';'defgh';23),:('foo';'bar';45)
columnTypes =: 'string';'string';'num'
DoString =: toupper
DoNum =: 0&j.
matrix
+---+-----+--+
|abc|defgh|23|
+---+-----+--+
|foo|bar |45|
+---+-----+--+
步骤(1),整理数据:
columnify =: <@:>"1@:|: :. rowify =: <"_1&>
columnify matrix
+---+-----+-----+
|abc|defgh|23 45|
|foo|bar | |
+---+-----+-----+
请注意,columnify 提供了一个逆向,它将重新“行化”数据,尽管您不应该这样做:见下文。
步骤 (2),将正确的动词应用于每一列(恰好一次),使用动词循环特征;.
:
homogenize =: ({. foo&.>@:{.`'') [^:('foo'-:])L:0~ ]
chain =: DoString`DoNum`] homogenize@{~ ('string';'num')&i.
请注意,未知列类型的默认转换是恒等函数]
。
动词homogenize
规范化每个列处理器的输入和输出(即抽象出预处理和后处理,以便用户只需提供转换的动态“核心”)。动词chain
将列类型列表作为输入,并派生一个适合使用左手参数 to ;.
(或类似运算符)的动名词。
因此:
1 (chain columnTypes);.1 columnify matrix
+---+-----+---------+
|ABC|DEFGH|0j23 0j45|
|FOO|BAR | |
+---+-----+---------+
或者,如果您确实必须有一个 NxM 盒装单元格表,请应用剪切“下”列:
1 (chain columnTypes);.1&.columnify matrix
+-----+-----+
|ABC |FOO |
+-----+-----+
|DEFGH|BAR |
+-----+-----+
|0j23 |0j45 |
+-----+-----+
但请注意,在 J 上下文中,出于性能和符号的原因,将表保留为同类列的列表更为合适。
J 在“整体”处理数组时效果最好;经验法则是您应该让原始名称或用户定义名称在每个应用程序中看到尽可能多的数据。这是这种“columificaton”方法的主要好处:如果您将数据存储为同质列的列表,那么以后操作起来会更快、更容易。
但是,如果您的用例确实要求您将数据保存为 NxM 盒装单元格表,那么将数据转换为列范式和从列范式转换是一项昂贵的空操作。在这种情况下,您应该坚持原来的解决方案,
1 chain\"1 matrix
哪个(因为您问过)实际上与该方法在相同的前提下起作用;.
。特别\
是,接受动名词参数并连续应用每个动词(即循环地对每个新的数据窗口)的那些原始运算符中的另一个是。
实际上,所做的是将1 chain\"1 matrix
矩阵分成行("1
),并且对于每一行,它创建一个 1 宽的移动窗口(- 矩阵每一行的宽数据窗口)。1 f\ matrix
chain
f
由于行的移动 1 窗口(rank-1 向量)是按顺序排列的行的原子,并且按chain
相同顺序给出的动词,实际上您将这些动词应用于矩阵,一。原子。在。一种。时间。
简而言之: 1 chain\"1 matrix
类似于foo"0 matrix
,除了每个原子的 foo 变化。并且应该避免它,foo"0 matrix
因为通常应该避免同样的原因:因为在小等级上应用函数会违背 J 的纹理,从而导致性能损失。
一般来说,最好尽可能使用更高级别的应用函数,在这种情况下,这需要转换(和维护)matrix
为列范式。
换句话说,在这里,;.
就是"1
如此。如果您发现整个/太长或太笨重(与 相比),您可以导入 [1] 中提供的脚本,该脚本将这些定义打包为可重用的实用程序,并带有扩展名。有关示例和说明,请参见页面。\
"0
columnify
homogenize
1 chain\"1 matrix
[1] 相关实用程序脚本: http:
//www.jsoftware.com/jwiki/DanBron/Snippets/DOOG