Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?Ho esportato un file CSV formato da due o più fonti diverse con nomi di colonna leggermente diversi.
Nessuna riga ha dati in più di una di quelle colonne. Come nello screenshot qui sotto:

Come faccio a combinarli tutti in un'unica colonna?
Un'idea è quella di utilizzare
Combine Columns()
che risulterà in una colonna Multiple Response, ma poiché i dati non si intersecano, sarà solo un numero in tutta la colonna. Quindi forza il tipo di dati su Numeric e il tipo di modellazione su Continuous. Ma produce warning\error.
Esiste un modo più pulito per farlo?
Automazione e scriptingAnalisi e modellazione dei dati di baseOggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?Io lo gestirei in questo modo
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
:AA bb = Sum( :AA bb, :AA_bb_ )
);
Utilizzando la funzione Sum() si ignorano i valori mancanti, quindi si otterranno i valori desiderati.
Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?Io,
Molte grazie.
Userò questa soluzione.
Ora sto provando a scrivere uno script in modo che i nomi delle colonne non siano codificati in modo rigido.
Non sono sicuro del motivo per cui ricevo questo errore:
For Each Row(
Column("AA bb") = 1234;
//Sum( :AA bb, :AA _bb_ )
);L'errore è:
tentativo di assegnare a un oggetto che non è un valore L alla riga 1 nell'accesso o nella valutazione di 'Assegna', Column( "AA bb" ) = /*###*/1234 /*###*/
Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?L'idea è di scrivere una funzione e di fornirle un dizionario.
Qualcosa del genere:
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]) )
);Solo questa variante genera il seguente errore:
è necessario che gli argomenti siano scalari, matrici o elenchi alla riga 1 nell'accesso o nella valutazione di 'Sum', Sum/*###*/(Column( dict[1] ), Column( dict[2] ))
Non sono mai riuscito a capire il fatto che a volte Column() funziona come previsto, a volte no. A volte devo usare As Column(). A volte qualcos'altro.
PS As Column() ha funzionato. Qualcuno può spiegare la differenza tra Column() e As Column()?
Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?Ok, ecco il mio ultimo frammento di codice:
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 )
)
);
C'è un modo per migliorarlo?
Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?È un po' più complicato del necessario. Anche questo codice funziona, senza pensarci troppo. Accetterà più di due nomi di colonna, nel caso in cui lo si desideri.
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 ) ) )
);Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?Column() si riferisce all'oggetto colonna, mentre As Column() si riferisce al valore di quella colonna nella Row() corrente.
Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?La mia prossima iterazione tiene conto di un caso in cui il nome della colonna è presente nel dizionario, ma non nella tabella:
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")
)
Come faresti se usassi Transform Each?
Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?Prova ad usare lo strumento concatenazione:
Crea una nuova colonna che includerà entrambe le variabili
Fare clic con il tasto destro del mouse sulla colonna
Selezionare Formula per aprire l'Editor delle formule.
Nell'Editor delle formule, vai all'elenco Funzioni sulla sinistra.
In Carattere, trova e seleziona Concatena.
Trascinare o selezionare la prima colonna nella prima casella degli argomenti della funzione Concatena.
Trascinare o selezionare la seconda colonna nella casella dell'argomento successivo.
Fare clic su OK o Applica per creare la nuova colonna combinata.
Oggetto: Pulizia dei dati: come combinare più colonne con nomi leggermente diversi e dati non intersecanti in una sola?Aggiungerei semplicemente Try().
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 ), . ) ) ) );