将数组转换为字符串大家好,
我试图从另一个表的数组中获取一个值,并将其用作我选择的值。 有没有办法将数组转换为字符串?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
数据表其他脚本编写回复:将数组转换为字符串我想这会给你你想要的
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
回复:将数组转换为字符串再次惊叹于吉姆直击问题核心的能力。 这里有两个不错的代码值得更长的解释:
这有什么作用?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1是数据表引用, “名称”是作为字符串的列名称(字面意思是“NAME”,但可以在变量中),并且柱子函数返回一个列引用。 这<<获取值message 从列中获取所有值,包括重复项。 这关联数组函数创建一组唯一值,并且<<获取钥匙消息返回唯一值。 (做得很好@jshvt17 .)
和这个?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
这<<选择哪里消息对每一行进行操作合并文件, 一次一个并在参数非零时选择行。
这位置()函数返回一个索引矩阵。 它在列表中搜索name_key对于 :Name_final 的出现。 结果矩阵可以有零行或多行,但在本例中它将有 0 或 1 行,因为键是唯一的。 这行()函数返回 0 或 1,然后比较 >0 并保持为 0 或 1。 因此,如果 :Name_final 在 ref_file_1:NAME 的列表中,则选择行。
选择:
如果 name_key 中有 >1e6 个名称,merge_file 中有 >1e7 行怎么办? 表演会是什么样子? loc 函数将进行大量搜索。 它将比较 1e13 字符串。 你会厌倦等待。 解决方法是使用这样的关联数组:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
现在 nameSet 中只有 1e7 次查找。 它们不是免费的,但比顺序检查 1e6 项要快得多。 我猜每个大约有 20 个比较(log2(1e6))。 这对于下一个维护者来说也可能更容易遵循。
(未经测试。 欢迎指正!)
回复:将数组转换为字符串克雷格,
我再一次学到了一些关于 JMP 的新知识。我最初使用 Contains() 函数编写代码,但后来转换为使用 Loc() 函数,因为我认为这是一个问题
Contains( "BARBARA ANN", "BARBARA")
返回一个 True。
我有(事实证明是错误的)如果包含的比较组件是项目的 JMP 列表,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
也会返回一个 True,但是,它返回一个 False,这意味着它进行了绝对匹配。
谢谢你的好信息