こんにちは皆さん、
私の質問は 2 つあります。 私のデータは次のように表示されます。
| 1-A | バツ | 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 列を除くすべての列をスタックして、すべてが 1 つのデータ列に統合されるようにします (結果として得られるラベル列はトレーサビリティを維持します)。
2. 新しいデータ列の欠損値のある行をすべて削除します。 簡単な方法: 欠損値を選択し、それを右クリックし、一致するセルを選択し、右クリックし、行を削除します。
3. テーブル分割を実行して、データテーブルの元の形状に戻します。 分割列は新しいデータ列です。 Split By は新しいラベル列で、ID 列ごとにグループ化できます。