有沒有辦法自動重新評估數據類型?如果我有一個分為不同列的數據表,則所有列都會按預期顯示“字符”數據類型。
現在,我們有沒有辦法編寫一個 JSL 腳本來自動重新評估數據類型應該是數字還是字符? 如果發現數據輸入是數字,是否將數據類型更改為數字?
回复:有沒有辦法自動重新評估數據類型?一種方法是計算缺失值的數量,獲取值列表,強制列為數字,然後再次計算缺失值的數量。 如果前後缺失的數量相同,則您有一個數字列。 如果不是,請將其更改回來並用副本替換這些值。
當非數字值(如 NA)出現在數字列中時,此方法會失敗。
Names Default to Here(1);
tblRef = Current Data Table();
For(i=1,i<=N Col(tblRef),i++,
nMissing = Col N Missing(Column(tblRef,i));
nextVals = Column(tblRef,i) << Get Values;
Column(tblRef,i) << Set Data Type(Numeric);
If(Col N Missing(Column(tblRef,i)) != nMissing,
Column(tblRef,i) << Set Data Type(Character);
Column(tblRef,i) << Set Values(nextVals)
)
)
回复:有沒有辦法自動重新評估數據類型?不要讓我找到解決方案,但另一種選擇是使用正則表達式來確定每列是否僅包含數字和句點(小數點)字符。 下面的示例獲取每一列,將其所有值連接成一個大字符串,然後檢查該字符串是否包含任何非數字或小數點的字符 ( [^0-9\.] )。 如果它在整個列中僅找到數字和小數點(即“包含項目”計算結果為零),則會將數據類型設置為數字。
Names Default to Here( 1 );
cols = Current Data Table() << Get Column Names();
for( i = 1, i <= Length( cols ), i++,
vals = As Column( cols[i] ) << Get Values;
valsConcat = Concat Items( vals, "" );
If( Contains Item( valsConcat, Pat Regex( "[^0-9\.]") ),
Continue(),
As Column( cols[i] ) << Set Data Type( "Numeric" );
)
);
回复:有沒有辦法自動重新評估數據類型?如果您不需要自動化解決方案,則重新編碼中有一個紅色三角形解析為數字選項。 它將任何非數字條目(如 NA)更改為缺失值。
回复:有沒有辦法自動重新評估數據類型?這種方法的一個潛在問題是它不支持科學記數法。 修改正則表達式以接受科學記數法和負數,同時拒絕電話和社會安全號碼等內容,這使得它變得更加複雜(哈!雙關語!)。
回复:有沒有辦法自動重新評估數據類型?這是我推薦的方法。 根據可能遇到的數據,我還做了以下操作:
1) 僅使用每列的前 k 行來做出決策,以提高效率。
2) 允許給定列(或其子集)中存在一定百分比的缺失(根據需要進行調整)。 低於此閾值,無論如何都轉換為數字。
回复:有沒有辦法自動重新評估數據類型?除了已經提到的複雜性之外,解決方案還考慮將逗號作為小數佔位符或作為 1000 的數字分隔符。 這樣它也可能是一個更加國際化的解決方案。
回复:有沒有辦法自動重新評估數據類型?好點(也是雙關語),布雷迪。 此正則表達式解決方案適用於表現良好的示例數據,但不能推廣到所有可能的數據。 我想有一個主要的正則表達式可以完成這項工作,但想出它可能是一件苦差事。 或者,可以使用一個或多個更簡單的 Contains Item 檢查循環遍歷列中的每一行;例如,一個可以允許初始破折號(對於負數)但拒絕任何包含非初始破折號的內容,然後另一個可以檢查該行是否符合科學記數法。 如果列中所有行的所有檢查均通過,則更改數據類型。 正如你所說,“明顯”更複雜。
回复:有沒有辦法自動重新評估數據類型?我參加聚會有點晚了,但“欺騙”的方法是將文件導出為 csv,然後重新導入,其中 JMP 將在打開時自動確定列類型。 不過,這假設您不需要保存任何表腳本或列屬性。 這是一個腳本。
//assume file is in the downloads folder
dt = open ("$DOWNLOADS/Data to Split.jmp");
dtsplit = Data Table( "Data to split" ) << Split(
Split By( :Label ),
Split( :Data ),
Output Table( "Split Data.jmp" ),
Sort by Column Property
);
close (dt, no save);
dtsplit << Save as ("$DESKTOP/Split Data.csv");
close (dtsplit, no save);
ndt = open ("$DESKTOP/Split Data.csv");