计算每行中的值我有一个列表中包含第 1-6 列的脚本
我正在尝试编写一个 JSL 脚本来计算单词 POR 出现的次数以及单词 test 出现的次数
下面的例子(手动完成最后两列)

阅读论坛我知道我需要将 DT 转换为矩阵,但我无法使其工作。
谢谢!
自动化和脚本编写回复:计算每行中的值我知道……但从时间的角度来看,这是一个令人惊讶的好方法。 有趣的是,虽然 concat 方法很奇怪,但速度也非常快。
例如,对于这些值的 200,000 行 x 10 列表(附加压缩文件),运行时间如下:

Names Default To Here( 1 );
dt = Current Data Table();
t1 = HP Time();
dt << new column("xx",
formula(sum( design (dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], {"test"})))
);
t2 = hptime();
dt << New Column( "xx",
formula(
count = 0;
dt = :Col1 << get data table;
For( i = 1, i <= 10, i++,
If( Column( dt, i )[Row()] == "test", count ++)
);
count;
)
);
t3 = hptime();
dt << new column("xx", formula(nrow(loc(dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], "test"))));
t4 = hptime();
dt << new column("concat", character, formula(Col1 || :Col2 || :Col3 || :Col4 || :Col5 || :Col6 || :Col7 || :Col8 || :Col9 ||:Col10));
dt << new column("xx", formula(length(:concat)-30));
t5 = hptime();
print(evalinsert("Design matrix method: ^(t2-t1)/1e6^ seconds."));
print(evalinsert("Looping method: ^(t3-t2)/1e6^ seconds."));
print(evalinsert("Nrow(Loc()) method: ^(t4-t3)/1e6^ seconds."));
print(evalinsert("Concat method: ^(t5-t4)/1e6^ seconds."));
回复:计算每行中的值非常酷......但我认为你已经步入了深渊回复:计算每行中的值我喜欢这个,克雷格。
看起来设计矩阵功能也可以处理这个想法 - 尝试这个公式来计算“a”的数量。
dt = :Col1 << get data table;
Sum( Design( dt[Row(), {:Col1, :Col2, :Col3, :Col4, :Col5}], {"a"} ) );
回复:计算每行中的值其他方式。
Column formula to count across rowColumn formula to count across row跨行计数的列公式
此公式使用数据表下标来获取第 8 行的类似 {"test","POR","test","test"} 的列表。
上面我使用了 1::4,它变成 Index(1,4) 作为快捷方式。 您应该使用 {Column1, Column 2, ... 相反,因为当我将其中一个值更改为“xyzzy”时,公式列的值不会更新,直到我强制重新运行公式。 如果 JMP 无法判断某列引用了另一列,则它不会重新评估。
这效果更好:
formula with explicit column namesformula with explicit column names具有明确列名的公式
回复:计算每行中的值你好,
请查看 JMP 的“值标签”属性,以及“标签到代码”和“代码到标签”列实用程序。
如果我不提倡使用数字 1 表示 POR,使用数字 0 表示测试(如果您愿意,1:测试,0:POR),那我就是失职了。 使用“值标签”列属性,我们可以使这些值看起来像“test”和“POR”,但在内部,它们是 0 和 1。
由于值是数字,因此可以使用本机列和行公式来完成计算。 对于 1 和 0 的情况,总和给出 1 的数量,而平均值给出 1 的比例。 在此示例中,如果我们将 POR 存储为 0,将“test”存储为 1,则只需选择所有感兴趣的列,右键单击并选择,即可找到给定行中的测试数新公式列 > 合并 > 总和从弹出菜单中。
下面是实际情况的图像。 这些单元格似乎包含文本,因为单词 POR 和 test 是左对齐的,但当您单击单元格时,您可以看到实际上 JMP 正在内部存储数字,类似于日期和时间的处理方式。

通过单击“列”窗格(数据表左侧中心)中列名称右侧的*,我们可以选择“值标签”来查看属性的当前设置:

干杯,
布雷迪
回复:计算每行中的值很酷的主意
回复:计算每行中的值你好,
另一种方法是通过一键转换连接所有列。
由于“test”比 POR 多 1 个字符,并且没有丢失数据,因此与仅包含“POR”的字符串相比,包含的每个“test”生成的字符串将增加 1 个字符。
要连接,请选择感兴趣的列并右键单击,如下所示进行选择。 然后为简洁起见,将列重命名为“concat”。

在下面的示例表中,有 6 列值得关注;因此,仅包含“POR”的字符串将具有 6 * 3 = 18 个字符。
因此,我们使用以下公式:
length(:concat) - 18 表示“test”== n_test 的数量。
和
6 - n_test 用于“POR”的数量。
一般来说,对于 n_test 我们会使用 (length(:concat) - 18)/k,其中 k 是两个短语之间的字符差异。 这里,由于 k == 1,我们省略它。

干杯,
布雷迪
回复:计算每行中的值我在 JMP 中创建了您提供的表格

然后我创建了一个新列并将以下公式应用于该列
count = 0;
For( i = 1, i <= 4, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
请注意,For() 循环最多只能达到 4,因为表中只有 4 列要处理
它给出以下结果

我已附上数据表
我强烈建议您花时间阅读“发现 JMP”文档,该文档可在“帮助”下拉菜单下找到
回复:计算每行中的值对于所有人,但它是每行
就像每行计算一个值在该行中出现的次数,然后在该行的末尾我写下“计数”值
请参阅下面的示例,我添加了一些表格回复:计算每行中的值嘿,这不行
例如,如果我在此运行它
| 上电复位 | 上电复位 | 上电复位 | 上电复位 |
| 上电复位 | 上电复位 | 上电复位 | 上电复位 |
| 测试 | 上电复位 | 上电复位 | 测试 |
| 测试 | 上电复位 | 上电复位 | 测试 |
| 上电复位 | 上电复位 | 上电复位 | 上电复位 |
| 上电复位 | 上电复位 | 上电复位 | 上电复位 |
| 测试 | 上电复位 | 上电复位 | 测试 |
| 测试 | 上电复位 | 测试 | 测试 |
计数结果为 0
当我运行“测试”时我期望的是:0,2,2,0,0,2,3
所以输出是这样的:
| 上电复位 | 上电复位 | 上电复位 | 上电复位 | 0 |
| 上电复位 | 上电复位 | 上电复位 | 上电复位 | 0 |
| 测试 | 上电复位 | 上电复位 | 测试 | 2 |
| 测试 | 上电复位 | 上电复位 | 测试 | 2 |
| 上电复位 | 上电复位 | 上电复位 | 上电复位 | 0 |
| 上电复位 | 上电复位 | 上电复位 | 上电复位 | 0 |
| 测试 | 上电复位 | 上电复位 | 测试 | 2 |
| 测试 | 上电复位 | 测试 | 测试 | 3 |
回复:计算每行中的值以下是计算计数的一种方法的公式
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "POR" ) )
);
count;
回复:计算每行中的值小问题,您需要每列还是全部?