用字元值填滿新列的最快方法是什麼?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />您好,我有一個執行高級表串聯的腳本,我想添加“來源列”來指示原始表名稱。 我有一些有效的方法,但對於大型表來說,所有方法都很慢。 我也嘗試過公式方法,但也不快。 我還可以使用其他技巧嗎?
下面的範例與我正在做的非常接近。 1M 行的資料表大小並不罕見,因此我真的很希望在大型表中將此操作降低到低秒數。
謝謝,
麥克風
dt =新表() ;
數據表= { dt } ;
行數= 50000 ;
dt <<新增行(行數) ;
時間2 =今天() ;
如果( 0 ,
dt <<新專欄( “測試” ,特點,設定每個值(評估(數據表[ 1 ]) <<得到名字)) ; // 50k 行需要 24 秒。
,
臨時列表= {} ;
為了(我= 1 ,我<=行數,我++,臨時列表[我] =評估(數據表[ 1 ]) <<得到名字) ; //104 秒,50k 行。
dt <<新專欄( “測試” ,特點,價值觀(臨時列表)) ;
) ;
展示(評估(今天() -時間2 )) ;
回覆:用字元值填滿新列的最快方法是什麼?有一個比我的第一個例子更簡單的方法,至少對於這種情況是如此。
開始=滴答秒();
dt = 新表();
dt << 新欄位( "測試", 字元, "標稱", 公式(評估( dt << 取得名稱 ) ) );
dt << addrows( 1e7 );
dt << 運行公式;
停止=滴答秒();
顯示(停止 - 開始);
資料表的 NewColumn 訊息的 Formula 參數最初設計為非常易於在常見情況下使用,例如
公式(身高+體重)
其中身高和體重是資料表列,並且應在每一行上進行新增。因此,Formula 不會計算其參數,而只是將未計算的表達式儲存為列的公式。
除非...外部函數是評估(...)您可以在上面的更簡單的範例中看到這一點。當處理 Formula(...) 參數時,它會尋找 Eval 並使用計算結果。JMP 中的其他地方也可以執行此操作。並且,還有其他地方,例如替代函數,使用表達式(...)以防止對表達式參數求值。
回覆:用字元值填滿新列的最快方法是什麼?謝謝克雷格。 在我發布原始訊息後,我想到 JMP 的本機 concatenate() 表函數具有“創建來源列”選項,並且我能夠使用標準連接功能找到此程式碼,然後單擊紅色三角形/ 原始腳本來看看它是如何工作的。 這個選項似乎沒有記錄在任何地方。我的腳本使用原始表的兩個副本,因此這個中間解決方案需要進行一些操作才能將其還原為原始表名稱。如果它是原始表,這將是一個很好的解決方案。
你的方法相當乾淨,而且速度當然很快。 對此類內容的需求經常出現,因此我將為此添加書籤。 我認為是時候了解這些功能組合的價值了。 我見過它們的使用,當我被告知如何讓某些東西正常工作時我也使用它們,但我似乎很少能夠識別何時使用它。 這次我很接近... 我以為我的公式可以工作(在OP中提到),但是查看程式碼我記得它不起作用,因為表達式只是出現在公式中。 我想我需要這樣的東西,但我不知道該怎麼做。
關於哪些類型的函數可以/應該包裝在表達式中以優化我的腳本,是否有一些經驗法則? 或者您會建議只運行它並進行時序分析並修復緩慢的問題,而這就是我所做的?
再次感謝,
麥克風
PS,感謝您提醒我有關刻度秒()的資訊。 我知道有一個比 Today() 更好的函數。
回覆:用字元值填滿新列的最快方法是什麼?開始=滴答秒();
dt = 新表();
評估(
評估表達式(
dt << 新列(“測試”,
特點,
“標稱”,
公式( Expr( dt << getname ) )
)
)
);
dt << addrows( 1e7 );
dt << 運行公式;
停止=滴答秒();
顯示(停止 - 開始);
停止-開始= 3.80000000004657; // 4 秒內 10,000,000 行
eval( evalExpr( ... expr( ... ) ... )) 模式是在 JMP 中操作表達式的一種方法。要理解它,請從 EvalExpr( ... ) 開始,它查看其參數以查找任何 Expr( ... )。對 Expr 部分進行求值,並將結果(在本例中為字串)保留在 Expr 的位置。EvalExpr 的結果是一個表達式,需要透過外層 eval(...) 來計算
可能有更快的方法;我沒有探索很遠。
