大家好,
我的問題是雙重的。 我的數據看起來像這樣:
| 1-A | X | y | 。 | 。 | 。 | 。 |
| 1-A | 。 | 。 | z | q | 。 | 。 |
| 1-A | 。 | 。 | 。 | 。 | w | w |
| 2-B | y | w | 。 | 。 | 。 | 。 |
| 2-B | 。 | 。 | t | y | 。 | 。 |
| 2-B | 。 | 。 | 。 | 。 | q | p |
我想 A) 刪除空資料點,B) 根據每行共有的第一列中的識別碼(即 1-A 和 2-B)合併行。
我希望我的最終結果如下所示:
對於具有數百個值的大表,有人對解決此問題有任何建議嗎?
先謝,
查理
是時候出動大槍了。這是一個應該可以工作的腳本。基本上它的工作方式是迭代所有行和列。如果下一行具有相同的 ID,則會將非缺失值傳遞到下一行。在給定 ID 的最後一行,所有非缺失值都應位於該行中。在最後一步中,您刪除所有多餘的行。
dt = Current Data Table();
dt << New Column( "Delete Later", character, formula( If( :ID[Row()] == :ID[Row() + 1], "Yes", "No" ) ) );
for(i=1,i<=N Row(dt),i++, //iterate through each row
//If next row has same ID, pass non-missing values down to next row
If(:Delete Later[i] == "Yes",
for(j=2,j<= (N Col(dt) - 1),j++, //iterate through each column (except ID and Delete Later)
//pass non-missing data down to next row
if(!isMissing(Column(dt,j)[i]), Column(dt,j)[i+1] = Column(dt,j)[i])
)
)
);
//Collapse all the extra rows
dt << Select Where(:Delete Later == "Yes") << Delete Rows();
這非常適合您的範例。它應該適用於您的表,但如果您有數百萬行,則可能需要很長時間才能完成。此腳本還假設該列名為“ID”,並且所有其他列的每個 ID 僅具有 1 行的非缺失值。
我用來測試腳本的起始表:
決賽桌:
重新建立我的起始表的腳本:
New Table( "ConsolidateTable",
Add Rows( 6 ),
New Column( "ID",
Character( 3 ),
"Nominal",
Set Values( {"1-A", "1-A", "1-A", "2-B", "2-B", "2-B"} ),
Set Display Width( 87 )
),
New Column( "Column 2",
Character( 16 ),
"Nominal",
Set Values( {"x", "", "", "y", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 3",
Character( 16 ),
"Nominal",
Set Values( {"y", "", "", "w", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 4",
Character( 16 ),
"Nominal",
Set Values( {"", "z", "", "", "t", ""} ),
Set Display Width( 87 )
),
New Column( "Column 5",
Character( 16 ),
"Nominal",
Set Values( {"", "q", "", "", "y", ""} ),
Set Display Width( 87 )
),
New Column( "Column 6",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "q"} ),
Set Display Width( 87 )
),
New Column( "Column 7",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "p"} ),
Set Display Width( 87 )
)
)不幸的是,該表有超過 1000 列。 謝謝你的建議,但這似乎不太可行。
現在,假設我想忽略空白資料並在以後處理它們。 我將如何合併行?希望這一步更加可行。
如果您沒有太多列,您可以先將它們全部設為字符,然後使用我推薦的步驟,然後將數字列轉換回來。如果您的表格比您的範例寬得多,則這可能不太可行。
不幸的是,數據是混合的:分類數據、二進位數據、數字數據、自由文字數據。 我希望簡化資料庫並刪除不必要的空白條目。 感謝您的建議,但我認為它不適用於這種情況。
感謝您的及時回覆。 我應該補充一點,我已經掩蓋了實際表格中的大部分細節 - 例如,當我嘗試步驟 #1 時,JMP 告訴我「無法堆疊。 堆疊列具有不同的資料類型」。
有沒有辦法堆疊各種資料類型的列?
最輕鬆的方法是:
1. 堆疊除 ID 列之外的所有這些列,以便將它們全部合併到單一資料列中(產生的標籤列保持可追溯性)。
2. 刪除新資料列中所有缺失值的行。 簡單方法:選擇缺失值>右鍵點選它>選擇匹配單元格>右鍵>刪除行。
3. 進行表格拆分以恢復資料表的原始形狀。 拆分列是新的資料列。 Split By 是新的標籤列,您可以按 ID 列進行分組。