Datenbereinigung: Wie kombiniere ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer einzigen?Ich habe eine exportierte CSV-Datei, die aus zwei oder mehr verschiedenen Quellen erstellt wurde, die leicht unterschiedliche Spaltennamen aufweisen.
Keine Zeile enthält Daten in mehr als einer dieser Spalten. Wie im Screenshot unten:

Wie kombiniere ich sie alle in einer Spalte?
Eine Idee besteht darin,
Combine Columns()
Dies führt zu einer Spalte mit Mehrfachantworten, aber da sich die Daten nicht überschneiden, wird die gesamte Spalte nur eine Zahl enthalten. Setzen Sie dann den Datentyp auf „Numerisch“ und den Modellierungstyp auf „Kontinuierlich“. Dies führt jedoch zu einer Warnung/einem Fehler.
Gibt es eine sauberere Möglichkeit, das zu tun?
Automatisierung und SkriptingGrundlegende Datenanalyse und ModellierungBetreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Ich würde es so handhaben
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
:AA bb = Sum( :AA bb, :AA_bb_ )
);
Bei Verwendung der Funktion Sum() werden fehlende Werte ignoriert, sodass Sie die gewünschten Werte erhalten.
Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Jim,
Vielen Dank.
Ich werde diese Lösung verwenden.
Ich versuche es jetzt so zu skripten, dass die Spaltennamen nicht fest codiert sind.
Ich bin nicht ganz sicher, warum ich hierzu eine Fehlermeldung erhalte:
For Each Row(
Column("AA bb") = 1234;
//Sum( :AA bb, :AA _bb_ )
);Fehler ist:
Versuch, einem Objekt, das kein L-Wert ist, in Zeile 1 beim Zugriff oder bei der Auswertung von 'Assign' die Spalte ( "AA bb" ) = /*###*/1234 /*###*/ zuzuweisen.
Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Die Idee besteht darin, eine Funktion zu schreiben und dieser Funktion ein Wörterbuch zuzuführen.
Etwa so:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row(
Column(dict[1]) = Sum( Column(dict[1]), Column(dict[2]) )
);Nur diese Variante gibt den folgenden Fehler aus:
benötigen Argumente, die Skalare, Matrizen oder Listen in Zeile 1 beim Zugriff oder bei der Auswertung von 'Sum' sein müssen, Sum/*###*/(Column( dict[1] ), Column( dict[2] ))
Ich konnte nie begreifen, dass Column() manchmal wie erwartet funktioniert und manchmal nicht. Manchmal muss ich As Column() verwenden. Manchmal etwas anderes.
PS: As Column() hat funktioniert. Kann jemand den Unterschied zwischen Column() und As Column() erklären?
Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Ok, mein letzter Code-Schnipsel ist hier:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
);
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
);
Gibt es eine Möglichkeit, es zu verbessern?
Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Es ist etwas komplizierter als nötig. Dieser Code funktioniert auch ohne viel Nachdenken. Er akzeptiert mehr als zwei Spaltennamen, falls dies gewünscht wird.
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row( dt,
As Column(dict[1]) = Sum( Transform Each( {v, i}, dict, As Column( v ) ) )
);Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Column() bezieht sich auf das Spaltenobjekt und As Column() bezieht sich auf den Wert dieser Spalte in der aktuellen Row().
Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Meine nächste Iteration berücksichtigt einen Fall, in dem der Spaltenname im Wörterbuch vorhanden ist, aber nicht in der Tabelle:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
If( Try( Column( value ) << Get Name, "nocolumn" ) != "nocolumn",
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
)
);
Name Expr(sumExpr);
Try(
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
),
Write("No columns found")
)
Wie würden Sie das tun, wenn Sie Transform Each verwenden?
Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Versuchen Sie es mit dem Verkettungstool:
Erstellen Sie eine neue Spalte, die beide Variablen enthält
Klicken Sie mit der rechten Maustaste auf die Spalte
Wählen Sie „Formel“ aus, um den Formel-Editor zu öffnen.
Gehen Sie im Formel-Editor zur Funktionsliste auf der linken Seite.
Suchen und wählen Sie unter „Zeichen“ die Option „Verketten“ aus.
Ziehen Sie die erste Spalte in das erste Argumentfeld der Funktion „Verketten“ oder wählen Sie sie aus.
Ziehen Sie die zweite Spalte in das nächste Argumentfeld oder wählen Sie sie aus.
Klicken Sie auf „OK“ oder „Übernehmen“, um die neue kombinierte Spalte zu erstellen.
Betreff: Datenbereinigung: Wie füge ich mehrere Spalten mit leicht unterschiedlichen Namen und sich nicht überschneidenden Daten zu einer zusammen?Ich würde einfach ein Try() hinzufügen.
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
For Each Row( dt, As Column( dict[1] ) = Sum( Transform Each( {v, i}, dict, Try( As Column( v ), . ) ) ) );