Hallo alle,
Meine Frage ist zweifach. Meine Daten sehen in etwa so aus:
| 1-A | X | j | . | . | . | . |
| 1-A | . | . | z | Q | . | . |
| 1-A | . | . | . | . | w | w |
| 2-B | j | w | . | . | . | . |
| 2-B | . | . | T | j | . | . |
| 2-B | . | . | . | . | Q | P |
Ich möchte A) die leeren Datenpunkte löschen und
die Zeilen gemäß der Kennung in der ersten Spalte konsolidieren, die jede Zeile gemeinsam hat (dh 1-A und 2-B).
Ich möchte, dass mein Endergebnis so aussieht:
Hat jemand Vorschläge zur Lösung dieses Problems für eine große Tabelle mit Hunderten von Werten?
Dank im Voraus,
Charlie
Zeit für die großen Waffen.Hier ist ein Skript, das funktionieren sollte.Die Funktionsweise besteht im Wesentlichen darin, alle Zeilen und Spalten zu durchlaufen.Wenn die nächste Zeile dieselbe ID hat, werden die nicht fehlenden Werte an die nächste Zeile weitergegeben.In der letzten Zeile für eine bestimmte ID sollten alle nicht fehlenden Werte in dieser Zeile enthalten sein.Im letzten Schritt löschen Sie alle zusätzlichen Zeilen.
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();
Das hat für Ihr Beispiel perfekt funktioniert.Es sollte für Ihre Tabelle funktionieren. Wenn Sie jedoch Millionen von Zeilen haben, kann es eine ganze Weile dauern, bis es fertig ist.Dieses Skript geht außerdem davon aus, dass die Spalte den Namen „ID“ trägt und alle anderen Spalten nicht fehlende Werte für nur eine Zeile für jede ID haben sollten.
Starttabelle, die ich zum Testen des Skripts verwendet habe:
Finaltisch:
Skript zum Neuerstellen meiner Starttabelle:
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 )
)
)Leider hat diese Tabelle mehr als 1000 Spalten. Vielen Dank für den Vorschlag, aber das scheint nicht machbar.
Angenommen, ich möchte die leeren Daten ignorieren und sie zu einem späteren Zeitpunkt bearbeiten. Wie würde ich die Zeilen konsolidieren?Hoffentlich ist dieser Schritt praktikabler.
Wenn Sie nicht zu viele Spalten haben, können Sie zunächst alle Spalten in Zeichen umwandeln, die von mir empfohlenen Schritte ausführen und dann die numerischen Spalten zurückkonvertieren.Wenn Ihre Tabelle viel breiter ist als Ihr Beispiel, ist dies möglicherweise nicht sehr realisierbar.
Leider sind die Daten gemischt: kategorisch, binär, numerisch, Freitext. Ich möchte die Datenbank vereinfachen und unnötige leere Einträge entfernen. Vielen Dank für den Vorschlag, aber ich glaube nicht, dass er in diesem Szenario funktionieren wird.
Wenn die Daten numerisch sind, mit Ausnahme der ersten Spalte, können Sie einfach verwenden
Tabellen==>Zusammenfassung
und geben Sie an, dass ein Mittelwert oder eine Summe für die betreffenden Spalten generiert werden soll
Danke für die schnelle Antwort. Ich sollte hinzufügen, dass ich viele Details in meiner tatsächlichen Tabelle beschönigt habe – wenn ich beispielsweise Schritt 1 versuche, sagt mir JMP: „Kann nicht gestapelt werden.“ „Gestapelte Spalten haben unterschiedliche Datentypen“.
Gibt es eine Möglichkeit, Spalten verschiedener Datentypen zu stapeln?
Der schmerzloseste Weg, dies zu tun, wäre:
1. Stapeln Sie alle diese Spalten mit Ausnahme der ID-Spalte, sodass sie alle in einer einzigen Datenspalte konsolidiert werden (die resultierende Label-Spalte gewährleistet die Rückverfolgbarkeit).
2. Löschen Sie alle Zeilen mit fehlenden Werten in der neuen Datenspalte. Einfache Möglichkeit: Wählen Sie einen fehlenden Wert aus > klicken Sie mit der rechten Maustaste darauf > wählen Sie passende Zellen aus > klicken Sie mit der rechten Maustaste > löschen Sie Zeilen.
3. Führen Sie eine Tabellenteilung durch, um zur ursprünglichen Form der Datentabelle zurückzukehren. Die geteilte Spalte ist die neue Datenspalte. „Teilen nach“ ist die neue Beschriftungsspalte, und Sie können nach der ID-Spalte gruppieren.