經過幾個小時的互聯網搜索,似乎沒有關於如何完成我想做的事情的明確答案,並且在多次編碼嘗試之後,這顯然是 JSL 與其他編程語言顯著不同的領域之一。 我有 CSV 文件,它們在客戶的自訂 VBA 程式中用作資料庫。 使用 CSV 檔案的原因很大程度上是因為可以輕鬆地將資料庫匯入 JMP 以執行定期分析,而無需像以前版本的自訂工具所要求的那樣建立專門的匯出功能。 我正在建立一個腳本來匯入資料庫檔案並執行一些初步準備,以便資料表中的所有內容都就位,以便可以執行效能分析。 其中大部分內容都是非常常規的,並且到目前為止已在我的 JSL 腳本中完成。
我現在遇到的問題是,我在幾個地方有零值,而這些地方實際上應該是缺失值。 這些零是由於使用 VBA 中的資料物件從 Excel 匯出資料而產生的。資料庫檔案中的資料永遠不會出現在工作表上,因為自訂 Excel 工具完全基於 GUI,因此實際遺失的資料在構成程式碼中資料物件的屬性中具有預設值 0; VBA 沒有與數值資料類型的缺失資料等效的功能。
因此,我想要做的就是根據其他列中的標誌將特定列中的零替換為缺失值。 例如,如果給定行中的“取消的讀取資料”列為“False”,則與該行的取消的讀取調查關聯的所有欄位都應該缺少值,因為未針對該特定進行取消的讀取調查記錄。 同樣,如果“調查已取消”列的值為“真”,則該行中的所有調查資料列都應包含缺失值,因為沒有對該記錄進行任何類型的調查。 設定零後,各種統計數據將會出現偏差,因為 JMP 將在分析中包含應忽略的記錄。
我嘗試了兩種不同的方法都沒有效果。 第一個是使用條件並循環遍歷列:
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);這裡的部分問題似乎是列引用(vehiclePackageColumn 和expiredReadsColumn)不是列號,因為使用vehiclePackageColumn = Column("Vehicle Packages") 不會傳回「Vehicle Packages」列的列號。 事實上,我找不到任何有關如何使用 JSL 捕獲列的列索引(數字)的資訊。
第二種方法是基於我在另一個論壇上看到的東西:
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
任何對此的幫助將不勝感激。
這是個簡單的:
colnames = dt << 取得列名稱(字串);
startindex = contains(colnames, "起始列的名稱");
endindex = contains(colnames, "結束欄位的名稱");
是的!
Jim,這似乎解決了根據特定列中標誌的狀態將缺失值放入一系列列中的主要問題。 因此,唯一剩下的問題是是否有辦法捕獲列索引。 我的資料表相當大,必須像我在測試您建議的程式碼時那樣手動計算列數,這是乏味的並且容易出錯;這個特定的資料表有 73 列。如果僅對於這樣的操作,缺乏確定 JSL 中命名列的列號的方法是一個嚴重的遺漏。
我認為這會起作用:
dt = 當前資料表();
For( i = 你的起始列號, i <= 你的結束列號, i++,
column( dt, i ) [ dt << 取得行 where( :Canceled Reads Data == "True")] = .;
);