SUMIF:如何获得跨列的条件总和?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我想将 10 列的总和计算到一个新列中,因此我只想对正值求和。 同样,我想要另一列对所有负值求和。 在 Excel 中,我将使用函数 SUMIF: =SUMIF(A1:J1;">0")
我如何在 JMP 中执行类似的操作?
使用 Excel 中的一个简单示例(显然我的数据集更大),这就是我的目标:
| A | 乙 | C | D | 正和 | 负和 |
| 1,00 | 2,00 | -7,00 | 5,00 | 8,00 | -7,00 |
| 4,00 | 64,00 | 55,90 | 5,20 | 129,10 | 0,00 |
| 86,10 | -34,44 | 5,60 | 7,21 | 98,91 | -34,44 |
| 6,00 | 8,00 | -96,00 | 6,00 | 20,00 | -96,00 |
| 1,00 | -8,00 | 5,00 | 0,64 | 6,64 | -8,00 |
非常感谢您的帮助!
雅妮
回复:SUMIF:如何获取跨列的条件总和?天哪,太漂亮了!
回复:SUMIF:如何获取跨列的条件总和?我喜欢这样简单而巧妙的列公式,就像上面布雷迪帖子中的公式一样。 但是,是的,它们通常会随着桌子的大小而大幅增加。
另一种方法是列公式直接获取当前行,而无需首先获取每行中的整个矩阵。 下面的公式就是对此的尝试。
它不像 Brady 的 JSL 代码或 Ian 对列的显式求和那么快,但它要快得多,并且可以更好地扩展(或多或少呈线性与桌子尺寸),比依赖的公式dt< 。 对于 10000x4 的表,在我的笔记本电脑上运行大约需要 0.2 秒。
该示例还展示了一种使用局部变量来概括公式的替代方法,而不是动态构建公式,这可以是一个挑战。 (在此示例中,假设公式列始终保留在最后一列)。
//示例表
dt =新表( “跨列的条件总和” ,添加行( 10000 )) ;
为了(我= 1 ,我<= 4 ,我++,
dt <<新专栏( “X” ,数字,公式(随机正态( 0 , 1 )))
) ;
dt <<删除列( 1 ) ;
// 添加所有列的条件总和
dt <<新专栏( 《正和》 ,
数字,
公式(
当地的({我= 0 , n =北科尔(当前数据表()) - 1 } ,
和(重复({我++ ;柱子(我)[] * (柱子(我)[] > 0 )} , n ))
)
)
) ;
dt <<新专栏( 《负和》 ,
数字,
公式(
当地的({我= 0 , n =北科尔(当前数据表()) - 2 } ,
和(重复({我++ ;柱子(我)[] * (柱子(我)[] < 0 )} , n ))
)
)
) ;
回复:SUMIF:如何获取跨列的条件总和?正如布雷迪已经说过的,如果您可以放弃“公式”方面(它允许您附加新行并自动获取结果),那么矩阵方法的扩展性会更好。
但如果您确实想动态创建公式列,它看起来会像这样:
名称默认到这里( 1 ) ;
// 具有六个源列的表
dt =新表( “列总和” ,
新专栏( “第 1 栏” ,数字, “连续的” ,格式( “固定十二月” , 10 , 3 ) ,公式(随机正态( 0 , 1 ) ) ) ,
新专栏( “第2栏” ,数字, “连续的” ,格式( “固定十二月” , 10 , 3 ) ,公式(随机正态( 0 , 1 ) ) ) ,
新专栏( “第3栏” ,数字, “连续的” ,格式( “固定十二月” , 10 , 3 ) ,公式(随机正态( 0 , 1 ) ) ) ,
新专栏( “第 4 栏” ,数字, “连续的” ,格式( “固定十二月” , 10 , 3 ) ,公式(随机正态( 0 , 1 ) ) ) ,
新专栏( “第5栏” ,数字, “连续的” ,格式( “固定十二月” , 10 , 3 ) ,公式(随机正态( 0 , 1 ) ) ) ,
新专栏( “第6栏” ,数字, “连续的” ,格式( “固定十二月” , 10 , 3 ) ,公式(随机正态( 0 , 1 ) ) ) ,
添加行( 10 )
) ;
// 列列表(可以是任意数量的列!)
列表= dt <<获取列名;
// 构建“负和”公式表达式
共同贡献=表达式(待定*如果(待定< 0 , 1 , 0 )) ;
形式参数=表达式(添加()) ;
为了( C = 1 , C <= N项(列表) , C ++,
thisCol贡献=名称表达式(代替(名称表达式(共同贡献) ,表达式(待定) ,评估表达式(作为列(列表[ C ]))))) ;
插入(形式参数, thisCol贡献) ;
) ;
nsExpr =表达式(公式(待定)) ;
代入( nsExpr ,表达式(待定) ,名称表达式(形式参数)) ;
// 打印(nsExpr);
// 构建“正和”公式表达式
共同贡献=表达式(待定*如果(待定>= 0 , 1 , 0 )) ;
形式参数=表达式(添加()) ;
为了( C = 1 , C <= N项(列表) , C ++,
thisCol贡献=名称表达式(代替(名称表达式(共同贡献) ,表达式(待定) ,评估表达式(作为列(列表[ C ]))))) ;
插入(形式参数, thisCol贡献) ;
) ;
psExpr =表达式(公式(待定)) ;
代入( psExpr ,表达式(待定) ,名称表达式(形式参数)) ;
// 打印(psExpr);
// 将两个公式列添加到 dt
nsCol = dt <<新专栏( “负数总和” ,数字,连续的,格式( “固定十二月” , 10 , 3 )) ;
制作公式=表达式(发送( nsCol )) ;
插入(制作公式,名称表达式( nsExpr )) ;
制作公式;
皮斯科尔= dt <<新专栏( “积极的总和” ,数字,连续的,格式( “固定十二月” , 10 , 3 )) ;
制作公式=表达式(发送(皮斯科尔)) ;
插入(制作公式,名称表达式(p sExpr )) ;
制作公式;
回复:SUMIF:如何获取跨列的条件总和?Brady 的结果将与 Ian 的结果匹配,但您必须更改此行:米= ( dt <<获取矩阵)[ 0 , 1 :: 4 ] ;
对此:米= ( dt <<获取矩阵)[ 0 , 1 :: 3 ] ;
Ian 创建的表仅包含三列,而 Brady 的示例包含 4 列。
回复:SUMIF:如何获取跨列的条件总和?亲爱的伊恩和布雷迪,
感谢您的友好和快速的帮助! 我尝试了两种方法,并以某种方式得到了两个不同的结果:-(。
通过手动测试一些示例,我发现 Ian 的方法给出了正确的结果,而 Brady 的脚本返回了更大的总和。 不知道为什么,不幸的是我仍然是 JMP 初学者,所以无法弄清楚出了什么问题。 但由于 Ian 的方法似乎效果很好,我决定坚持使用该方法(尽管该公式对于 10 列来说相当长)。
所以感谢你们的帮助!
(希望如果我需要 100 列,JMP 届时将具有 SUMIF 功能;) )
干杯,
雅妮
回复:SUMIF:如何获取跨列的条件总和?正如 Ian 提到的,这对于许多专栏来说可能会变得笨拙。 如果您并不真正需要公式(即源列不会更改),您可以通过运行以下 JSL 来快速对所有行执行此操作,其中所需的数据表为当前(代码假设数字位于第 1-4 列中) ,根据代码第 2 行中的索引...根据需要进行更改,但保持它们连续):
dt =当前数据表() ;
米= ( dt <<获取矩阵)[ 0 , 1 :: 4 ] ;
dt <<新专栏( 《正和》 , <<设定值(总和(乳化(米> 0 ,米) ` ) ` )) ;
dt <<新专栏( 《负和》 , <<设定值(总和(乳化(米< 0 ,米) ` ) ` )) ;
如果您需要一个公式,您可以使用以下公式(最好将其复制/粘贴到编辑器中),这很简单,但随着表变得非常大,运行速度会变慢,因为您将获得每一行的整个矩阵。 (将不等式改为负和。 这 :*运算符是上面 emult() 函数中使用的元素乘法。)
dt =当前数据表() ;
米= ( dt <<获取矩阵)[排() ,指数( 1 , 4 )] ;
和( (米> 0 )
米) ;
这里的权衡是,尽管它有性能限制,但随着函数的发展,它相当短、简单,并且如果添加更多列,则很容易更改。 不过,我只会在相对较小的桌子上使用它。 否则,最好使用伊恩建议的东西。
比较我针对 10,000 行 4 列随机数表描述的两种方法:
脚本方法:0.002713秒
公式逼近:6.050183秒
对于 10,000,000 行 x 4 列的表,脚本方法只需要 3 秒。 一小时后,我停止在只有 1,000,000 行的表上运行公式方法。 这实际上取决于您是否需要公式部分,或者是否愿意将脚本保存到表中并根据需要运行它。 如果是这样,您将获得相当大的性能优势。
干杯,
布雷迪
回复:SUMIF:如何获取跨列的条件总和?您可以使用类似于此表中的方法:
新表( “列总和” ,
添加行( 0 ) ,
新专栏( “第 1 栏” ,
数字,
“连续的” ,
格式( “固定十二月” , 10 , 3 ) ,
公式(随机正态( 0 , 1 ))
) ,
新专栏( “第2栏” ,
数字,
“连续的” ,
格式( “固定十二月” , 10 , 3 ) ,
公式(随机正态( 0 , 1 ))
) ,
新专栏( “第3栏” ,
数字,
“连续的” ,
格式( “固定十二月” , 10 , 3 ) ,
公式(随机正态( 0 , 1 ))
) ,
新专栏( “积极的总和” ,
数字,
“连续的” ,
格式( “固定十二月” , 10 , 3 ) ,
公式(
:第 1 栏*如果( :第 1 栏>= 0 , 1 , 0 ) + :第2栏*
如果( :第2栏>= 0 , 1 , 0 ) + :第3栏*如果( :第3栏>= 0 , 1 , 0 )
)
) ,
新专栏( “负数总和” ,
数字,
“连续的” ,
格式( “固定十二月” , 10 , 3 ) ,
公式(
:第 1 栏*如果( :第 1 栏< 0 , 1 , 0 ) + :第2栏*
如果( :第2栏< 0 , 1 , 0 ) + :第3栏*如果( :第3栏< 0 , 1 , 0 )
)
) ,
添加行( 10 )
);
对于许多列,以编程方式构建必需的“总和”列可能会更容易。
回复:SUMIF:如何获取跨列的条件总和?你好,
这是对我当前任务非常有用的脚本。
它非常适合我的值为“0/0”的列
dt << 新列("总和",数值, 公式(
Local({i = 0, n = N Col(当前数据表()) - 1},Sum(Repeat({i++ ; (Column(i)[] ==="0/0")}, n))) ));
但是,如何编辑包含“some_character”的列并且我需要计算这些列?
我附加了一个数据表,其中最后一列“Sum”具有所需的公式。
我有一个大数据表,想要一个脚本来计算具有特定值的列。
谢谢你,
副总裁