计算每行中的值我在列表中有一个带有 col 1-6 的脚本
我正在尝试编写一个 JSL 脚本,该脚本将计算 POR 出现的次数以及 test 出现的次数
下面的示例(在最后两列中手动完成)

阅读论坛我知道我需要将 DT 转换为矩阵,但我无法使其工作。
谢谢!
脚本编写回复:计算每行中的值小问题,你需要每列还是全部?
回复:计算每行中的值以下是计算计数的一种方法的公式
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;
回复:计算每行中的值为所有人,但它是每一行
就像每一行计算值出现在该行内的次数,然后在该行的末尾我写了“计数”值
看我下面的例子我添加了一些表格回复:计算每行中的值其他方式。
跨行计数的列公式
此公式使用数据表下标来获取第 8 行的 {"test","POR","test","test"} 列表。
上面我使用了 1::4,它变成了 Index(1,4) 作为快捷方式。 您应该使用 {Column1, Column 2, ... 列 N} 而不是因为当我将其中一个值更改为“xyzzy”时,直到我强制重新运行公式时,公式列的值才会更新。 如果 JMP 无法判断某列引用了另一列,则不会重新评估。
这效果更好:
具有显式列名的公式
回复:计算每行中的值很酷……但我觉得你有点踏入了大深渊回复:计算每行中的值我知道......但从时间的角度来看,这是一种非常好的方法。 有趣的是 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."));
回复:计算每行中的值你好,
另一种方法涉及使用一键转换连接所有列。
由于“测试”比 POR 多 1 个字符,并且您没有丢失数据,因此与仅包含“POR”的字符串相比,包含的每个“测试”的结果字符串将增加 1 个字符。
要连接,请选择感兴趣的列并右键单击,选择如下。 为简洁起见,然后将列重命名为“concat”。

在下面的示例表中,有 6 个感兴趣的列;因此,只有“POR”的字符串将有 6 * 3 = 18 个字符。
因此,我们使用以下公式:
length(:concat) - “test” == n_test 的数量为 18。
和
6 - n_test 用于“POR”的数量。
通常,对于 n_test,我们会使用 (length(:concat) - 18)/k,其中 k 是两个短语之间的字符差异。 在这里,由于 k == 1,我们省略了它。

干杯,
布雷迪
回复:计算每行中的值我喜欢这个,克雷格。
看起来设计矩阵功能可以处理这个想法,试试这个公式来计算“a”的数量。
dt = :Col1 << get data table;
Sum( Design( dt[Row(), {:Col1, :Col2, :Col3, :Col4, :Col5}], {"a"} ) );
回复:计算每行中的值嘿,这不起作用
例如,如果我在此运行它
| 上门 | 上门 | 上门 | 上门 |
| 上门 | 上门 | 上门 | 上门 |
| 测试 | 上门 | 上门 | 测试 |
| 测试 | 上门 | 上门 | 测试 |
| 上门 | 上门 | 上门 | 上门 |
| 上门 | 上门 | 上门 | 上门 |
| 测试 | 上门 | 上门 | 测试 |
| 测试 | 上门 | 测试 | 测试 |
计数结果为 0
当我运行“测试”时,我期望的是:0,2,2,0,0,2,3
所以输出是这样的:
| 上门 | 上门 | 上门 | 上门 | 0 |
| 上门 | 上门 | 上门 | 上门 | 0 |
| 测试 | 上门 | 上门 | 测试 | 2 |
| 测试 | 上门 | 上门 | 测试 | 2 |
| 上门 | 上门 | 上门 | 上门 | 0 |
| 上门 | 上门 | 上门 | 上门 | 0 |
| 测试 | 上门 | 上门 | 测试 | 2 |
| 测试 | 上门 | 测试 | 测试 | 3 |