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”具有所需的公式。
我有一個大數據表,想要一個腳本來計算具有特定值的列。
謝謝你,
副總裁