<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好,
我尝试使用“对于每一行”和“开始数据更新”脚本命令来更新与列相关的特定行的计算。
根据下表,我打算有两个附加列,即缺陷率 (%) 和产量,它们都使用相同的细胞数量/每日总数等式。
但是,缺陷率 (%) 列将仅计算类别 = Reject & MRB 的行,良率列将仅计算类别 = Binned 的行。
我可以使用 IF 命令来解决这个问题,例如
dt=当前数据表();
dt<< 新列("缺陷率(%)", 数字, "连续", 公式(Name Expr(If(:Category == "Reject", "MRB" ,:Cell 数量/:每日总计)))) ;
但是,我尝试学习如何将 For every row 与 Begin Data Update 结合使用来达到相同的结果。
dt<< 新列("产量", 数字, "连续");
<< 开始数据更新;
对于每行(:Yield_ = Selected(行状态())=包含(:类别,“分箱”),:单元格数量/:每日总计)
有人可以帮忙吗?
谢谢,
类别 | 工作周 | 日期_产品。 | 电池数量 | 每日总计 | 不良率(%) | 屈服 |
| 拒绝 | 25 | 2016-06-20 | 第751章 | 15553 | | |
| MRB | 25 | 2016-06-20 | 21 | 15553 | 0.00135022 | |
| 装箱 | 25 | 2016-06-20 | 14781 | 15553 | 0.95036327 | 0.95036327 |
| 拒绝 | 25 | 2016-06-21 | 第1251章 | 31586 | | |
| MRB | 25 | 2016-06-21 | 83 | 31586 | 0.00262775 | |
| 装箱 | 25 | 2016-06-21 | 30252 | 31586 | 0.9577661 | 0.9577661 |
| 拒绝 | 25 | 2016-06-22 | 1276 | 27964 | | |
| MRB | 25 | 2016-06-22 | 42 | 27964 | 0.00150193 | |
| 装箱 | 25 | 2016-06-22 | 26646 | 27964 | 0.95286797 | 0.95286797 |
| 拒绝 | 25 | 2016-06-23 | 126 | 1786 | | |
| MRB | 25 | 2016-06-23 | 5 | 1786 | 0.00279955 | |
| 装箱 | 25 | 2016-06-23 | 1655 | 1786 | 0.92665174 | 0.92665174 |
嗨,伯尼426,
根据我个人的经验,IF命令非常快地完成其操作,并且会立即返回结果,因为它们只处理是或否的情况。 另一方面,在通过循环完全生成结果之前,您会看到一些明显的延迟,因为循环命令必须处理迭代,并且它们将继续运行,直到到达程序员定义的最后一次迭代。
这些语句仅适用于涉及大量行和列的超大型数据集,这使得 IF 命令在时间消耗方面比循环命令更优越。 然而,对于较小的数据集,使用任一命令都是安全的,因为填充结果的时间延迟可以忽略不计。
此致,
瓦尔
嗨瓦尔,
感谢您建议的解决方案,它们都运行良好。
实际上,我想出了另一种使用 IF 命令的公式方法,例如
dt=当前数据表();
dt<< 新列("缺陷率(%)", 数字, "连续", 公式(Name Expr(If((contains(:Category, "MRB")| contains(:Category, "Reject")),:电池数量/:每日总数))));
dt<< New Column("产量", Numeric, "连续", Formula(Name Expr(If(:Category == "Binned",:单元格数量/:每日总计))));
您知道使用 IF 命令和循环命令的黑白速度差异是多少吗?
非常感谢,
你好,
根据您问题中的预期输出,我认为您的公式中存在轻微错误“不良率(%) ”列,如果您只想忽略“类别”列中的“拒绝”行。
我从未尝试过使用 For every row 或之前开始数据更新,所以我不确定如何使用这些命令修复当前的代码。 然而我有两种替代方法来实现相同的输出。
1)使用IF命令(更快的方法):
dt=当前数据表();
a = (dt<< 新列("DR", "连续", 公式(If(:类别 == "拒绝", "", Char(:单元格数量 / :每日总计)))))<<获取值;
dt << New Column("不良率(%)", "连续", 设置值(a));
b = (dt<< 新列("Y", "连续", 公式(If(:Category == "Binned", Char(:单元格数量 / :每日总计), ""))))<<获取值;
dt << 新列("产量", "连续", 设置值(b));
dt<<删除列({"DR","Y"});
由于某些列应作为空列 ("") 返回,因此创建的列将自动将其自身设置为字符列,即使您在创建列时已将它们定义为数字。 因此,我创建了额外的虚拟列来满足计算目的,并将这些值设置到新列中(“不良率(%) ”和“产量”)您打算创建的。 这样,您将获得数字列。
2) 使用 Get rows where() 和 FOR 循环:
dt=当前数据表();
dt << New Column("缺陷率(%)", "连续", numeric);
r1 = dt << 获取行 where(:Category!="Reject");
对于 (i=1, i<=nrows(r1), i++,
Column(dt,“不良率(%)”)[r1 ] = :电池数量[r1 ] / :每日总计[r1 ]
);
dt << 新列("产量", "连续", 数字);
r2 = dt << 获取行 where(:Category=="Binned");
对于 (i=1, i<=nrows(r2), i++,
列(dt,“产量”)[r2 ] = :电池数量[r2 ] / :每日总计[r2 ]
);
我相信如果您的数据集很大,这种方法会更慢,因为循环需要更长的处理时间。
最终输出:

希望这可以帮助!
此致,
瓦尔