<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />ciao gente, ho una domanda su come posso combinare un numero di colonne create nella mia tabella, in una nuova colonna che descrive se una di queste colonne ha un valore char specifico ("schermato").
Attualmente i miei set di dati vengono analizzati con uno script che aggiunge "n" nuove colonne che contengono i valori dei caratteri "screened" e "unscreened" in base alle formule nello script.
Il mio obiettivo è includere nello script un passaggio finale che aggiunga una nuova colonna che valuti il valore in ciascuna delle 'n' nuove colonne e se per ogni riga, una di queste colonne è 'schermata', etichetta quella riga come schermata .
Se il numero di nuove colonne fosse sempre lo stesso, scriverei semplicemente un'istruzione If lunga, controllando il valore in ciascuna colonna. Tuttavia, ho bisogno di script per guardare 'n' numero di colonne. Ho pensato di utilizzare un ciclo FOR all'interno di una forumula, ad esempio qualcosa del tipo:
dt << Nuova colonna("Tutti_schermi",character,nominal,setformula(
If( For( i = 1, i <= N elementi( individualScreenColumns ), individualScreenColumns == "Schermata"), ---> necessita di un po' di magia tale che se una qualsiasi delle colonne di schermatura contiene schermo, allora ---> "Schermata", "Non schermata" ) );
Ma poiché i cicli FOR non restituiscono alcun valore, non sono riuscito a capire questa magia. Qualcuno ha qualche idea?
Grazie,
--Pesca
L'implementazione di operazioni per riga su un numero sconosciuto di colonne nelle formule di colonna non è molto semplice (tuttavia non è richiesta la magia).
Di seguito sono riportate alcune idee che sfruttano le variabili locali:
// Solo una tabella di esempio
n = 5 ;
nr = 10 ;però
dt = Nuova tavola ( "Riepilogo proiezione" , Aggiungi righe ( nr ) , Aggiungi più colonne ( "X" , n , carattere )) ;
Per ( io = 1 , io <= n , io ++,
Colonna ( dt , io ) << Imposta ogni valore ({ "proiettato" , "non schermato" }[ 1 + ( Intero casuale ( 1 , nr ) > 1 )])
) ;
// Nuova colonna che indica se una colonna contiene "screened"
dt << Nuova colonna ( "Schermato" ,
Carattere ,
Formula (
Locale ({ io = 0 , n = N Col ( Tabella dati corrente ()) - 1 } ,
Se ( Contiene ( Ripetere ({ io ++ ; Colonna ( io )[]} , n ) , "proiettato" ) ,
"proiettato"
)
)
)
) ;
// Lo stesso ma con un ciclo For(); codice meno ordinato ma probabilmente più efficiente di Repeat() per n
// perché non vengono create liste intermedie
dt << Nuova colonna ( "Schermata 2" ,
Carattere ,
Formula (
Locale ({ io , n = N Col ( Tabella dati corrente ()) - 2 , S = "" } ,
Per ( io = 1 , io <= n , io ++,
Se ( Colonna ( io )[] == "proiettato" ,
S = "proiettato" ;
Rompere () ;
)
) ;
S ;
)
)
) ;
// In alternativa, restituisce nr di "screened"
dt << Nuova colonna ( "Nr di schermato" ,
Numerico ,
Formula ( Locale ({ io = 0 , n = N Col ( Tabella dati corrente ()) - 3 } , Somma ( Ripetere ({ io ++ ; Colonna ( io )[] == "proiettato" } , n )))) ) ;
grazie Jim. poiché non conosco il numero di colonne, proverò a inserire la tua equazione in un expr() usando un ciclo for, quindi lo sposterò nell'istruzione if con un eval() dell'espressione generata nel ciclo for .
Uso una sommatoria bouliana per risolvere il problema di cui stai parlando.Se hai 4 colonne, a,b,c,d, ho usato una formula di:
If(sum(a=="screened",b=="screened",c=="screened",d=="screened")>0, "screened","")