使用 JSL 删除具有一个或多个空值的行<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我有一个表,其中每行包含三个温度下的单个测量类型,每个测量类型都存储在自己的列中。 最终,我想计算这些测量值之间的增量,然后将这些数据堆叠到一个新表中。 但是,并非所有测量都是在所有三个温度下进行的,我需要排除一个或多个数据列为空的那些测量(行)。 我需要使用 JMP 9.0 脚本来执行此操作。
鉴于:
dt分割 =
| 测量 | T1 | T2 | T3 |
|---|
| 测量A | 5 | 12 | 89 |
| 测量B | 13 | | 8 |
| 测量C | | 52 | 57 |
| 测量D | 22 | 21 | |
| 测量E | 8 | | |
| 测量F | | | 15 |
| 测量G | | 54 | |
我需要制作:
dtClean =
我试图使用类似的东西:
dtSplit << Select Where(
Is Empty(:T1) ||
Is Empty(:T2) ||
is Empty(:T3)
) << Delete Rows;
但是,任何 SelectWhere(Is Empty(:COL)) 始终选择所有行。
我确信我错过了一些简单的事情,非常感谢您的帮助,谢谢,
- 马特
回复:使用 JSL 删除具有一个或多个空值的行你好
感谢您的意见。 检查了您推荐的缺失数据模式,它有点有效,但并不完全。
在我的数据表中,每个名字都有 4 个不同的行。 名称的 4 行中的每一行都是 1 项测试的结果(sens、mask、EVM 和 power)
在我的数据表示例中,设备 A 未通过第一个测试“Sens”,但通过了第二、第三和第四测试。 由于设备 A 未通过“Sens”,因此即使它通过了第二、第三和第四次测试,它也是一个失败设备。
如果我使用 Tables==>Missing Data Pattern,则 A 的第 2、3 和 4 行将被删除。 这不是我想要的。 我想在没有数据的情况下删除每个名称的 4 行(10 MHz、20 MHz、30 MHz 和 1000 MHz 上没有数据)。 在我的数据表中,名称C、G、H、I、JK和N将被删除。
感谢您的帮助
回复:使用 JSL 删除具有一个或多个空值的行您需要查看缺失数据模式平台形式。它将允许您识别具有所有缺失值的所有行,然后您可以选择删除这些行等。
表==>缺失数据模式
回复:使用 JSL 删除具有一个或多个空值的行你好
这是我的第一篇文章,不确定附加的 Excel 文件是否通过。 如果不,
我还附上了示例数据文件的 PNG
我对 JMP 非常陌生(我正在使用 JMP 14),需要有关行删除脚本的帮助。
我的数据表包含许多不同设备的数据,其中每个设备都经过测试
宽频率范围内的四种不同故障(灵敏度、模板、EVM 和功率)
从 10 MHz 到 1000 MHz。 通过的设备是所有四个都有空单元格“”的设备
跨频率范围进行测试,我想将它们从数据表中删除。
(删除附加 Excel 文件中绿色的行 - 设备 C、G、H、I、J、K 和 N)
第一个问题:如何删除空行(列 10 MHz 到 1000 MHz = 空)
我发现下面的命令类似但没有用,因为我有 100 个不同的列和“and”
如果我们后来决定增加频率,它们全部都相当冗长且不可扩展
超过 1000 MHz
dtsplit << 选择其中(缺失(:T1) | 缺失(:T2) | 缺失(:T3)) << 删除行;
我也尝试过这个命令:
对于( i = 2, i <= 101, i++,
dtSplit << select where( Is Missing( Column( i )[] ) ) << 删除行
);
这个命令给我一个错误:
在以下脚本中,错误标记为 /*###*/
dt = 当前数据表();
对于( i = 2, i <= 100, i++,
dtSplit/*###*/ <);
第二个问题:删除的行必须是 4 的倍数,因为每个设备都被测试了 4 次。
我不太确定该怎么做
非常感谢您对此的帮助
谢谢
新_2_JMP
回复:使用 JSL 删除具有一个或多个空值的行如果您只检查单个单元格:
if ( Is Missing( Column( dt,"Value" )[7] ),
dt << delete rows([7]);
);
回复:使用 JSL 删除具有一个或多个空值的行您的代码仅检查第 7 行。您需要测试每一行
dt << select where( Is Missing( Column( dt,"weight" )[row()] ) ) << delete rows;
回复:使用 JSL 删除具有一个或多个空值的行你好,
我正在尝试做一些同样的事情。
我需要检查单元格是否为空,然后删除该行(如果是)。
我尝试了以下方法 -
dt << select where( Is Missing( Column( dt,"Value" )[7] ) ) << 删除行;
但它会删除表中的所有行。
寻找想法。
回复:使用 JSL 删除具有一个或多个空值的行很棒的讨论。 我们遇到了类似的问题,从传感器文件导入时,文件末尾有很多空行。 我们想要删除没有传感器数据的行。 但是,不想删除仍有一些信息的行。下面是用 JMP14 编写的,但认为它适用于以前的版本。 在 JMP14 中,我知道有“行选择”>“选择重复行”。 但找不到类似的函数来对一行中的所有数字列求和。 在下面的脚本中,Sum() 将在矩阵的行中返回 null,但我想要一个零。 发现 V Sum() 的输出对于所有 null 都会返回 0。 为了工作,只需将行向量转置为列向量。无论您有多少个数字列,只要它们都是空的,这都适用。 如果有人有更好的解决方案仍然感兴趣。
dt = Current Data Table();
// Get all numeric data
m = dt << Get As Matrix;
// for each row, test if the V Sum is 0 or non-zero
// V Sum returns 0 for all null
// Sum() returns null for all null
rowlist = {};
For(i= N Rows(m), i>=1,i--,
If(V Sum(Transpose(m[i,0]))[1] == 0,
Insert Into(rowlist,i)
)
);
dt << Delete Rows(rowlist);回复:使用 JSL 删除具有一个或多个空值的行使用串联运算符是一个转录错误——旧习难改。
事实证明,问题是我的列名,实际上是“88”、“95”和“105”,并且使用 Is Missing(:88) 选择了所有行。
dtsplit << Select Where(Is missing(:Name("T1")) | Is missing(:Name("T2")) | is missing(:Name("T3"))) << Delete Rows;
效果很好。
回复:使用 JSL 删除具有一个或多个空值的行您正在使用字符串连接运算符 ||而不是 OR 运算符 |。正如 MS 所示,您需要使用 Is Missing 函数而不是 Is Empty。你的代码变成:
dtsplit << Select Where(Is missing(:T1) | Is missing(:T2) | is missing(:T3)) << Delete Rows;
回复:使用 JSL 删除具有一个或多个空值的行抱歉,我错过了 JMP9 要求。 Loc Nonmissing() 函数似乎是 JMP 10 中的新函数,因此上述函数在 JMP 9 中不起作用。
这是在 JMP 9 中工作的替代方法,与您的代码类似,但使用循环。
For( i = 2, i <= 4, i++,
dtSplit << select where( Is Missing( Column( i )[] ) ) << delete rows
);
回复:使用 JSL 删除具有一个或多个空值的行这可以通过不同的方式来完成。 对于数字列,矩阵函数通常是有效的。
以下是删除第 2、3 和 4 列中缺少单元格的所有行的示例:
keeprows = Loc Nonmissing( dtSplit << get as matrix( {2, 3, 4} ) );
dtSplit << select rows( keeprows ) << invert Row Selection << delete rows;
这是另一种方法,制作不丢失单元格的列子集(保持原始表不变):
dtClean = dtSplit << Clear Column Selection() << subset( rows( Loc Nonmissing( dt << get as matrix( {2, 3, 4} ) ) ) );回复:使用 JSL 删除具有一个或多个空值的行该脚本将在标题为“名称”的列之后开始工作,并继续删除表末尾的空行。
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = N Items(cnmes);
// Find the index of the "Device 2" column
For(k = 1, k <= N Items(cnmes), k++,
If(Contains(cnmes[k], "Names"),
Start = k + 1;
Break(); // Exit loop once found
);
);
// Loop through the columns from Start to End and delete rows with missing values
For(i = Start, i <= End, i++,
dt << Select Where(Is Missing(Column(i)[])) << Delete Rows;
);