<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />salut les gens, j'ai une question concernant la façon dont je peux combiner un certain nombre de colonnes créées dans ma table, dans une nouvelle colonne qui décrit si l'une de ces colonnes a une valeur char spécifique ("screened").
Actuellement, mes ensembles de données sont analysés avec un script qui ajoute "n" nouvelles colonnes contenant les valeurs char "screened" et "unscreened" en fonction des formules du script.
Mon objectif est d'inclure dans le script une étape finale qui ajoute une nouvelle colonne qui évalue la valeur dans chacune des 'n' nouvelles colonnes et si pour chaque ligne, l'une de ces colonnes est 'filtrée' alors elle marque cette ligne comme filtrée .
Si le nombre de nouvelles colonnes était toujours le même, j'écrirais simplement une longue instruction If, en vérifiant la valeur dans chaque colonne. Cependant, j'ai besoin de le scripter pour regarder 'n' nombre de colonnes. J'ai pensé à utiliser une boucle FOR à l'intérieur d'une formule, par exemple, quelque chose comme :
dt << Nouvelle colonne("Tous_écrans",caractère,nominal,setformula(
Si( Pour( je = 1, je <= N éléments( individualScreenColumns ), individualScreenColumns == "Screened"), ---> besoin d'un peu de magie pour que si l'une des colonnes de filtrage contient screen, alors ---> "Screened", "Unscreened" ) );
Mais comme les boucles FOR ne renvoient aucune valeur, je ne pouvais pas comprendre cette magie. Quelqu'un at-il des idées?
Merci,
--La pêche
La mise en œuvre d'opérations par ligne sur un nombre inconnu de colonnes dans des formules de colonne n'est pas très simple (mais la magie n'est pas nécessaire).
Voici quelques idées tirant parti des variables locales :
// Juste un exemple de table
n = 5 ;
nr = dix ;toutefois
dt = Nouveau tableau ( "Résumé de la projection" , Ajouter des lignes ( nr ) , Ajouter plusieurs colonnes ( "X" , n , personnage )) ;
Pour ( je = 1 , je <= n , je ++,
Colonne ( dt , je ) << Définir chaque valeur ({ "dépisté" , "non filtré" }[ 1 + ( Entier aléatoire ( 1 , nr ) > 1 )])
) ;
// Nouvelle colonne indiquant si une colonne contient "screened"
dt << Nouvelle colonne ( "Sélectionné" ,
Personnage ,
Formule (
Local ({ je = 0 , n = Col N ( Tableau de données actuel ()) - 1 } ,
Si ( Contient ( Répéter ({ je ++ ; Colonne ( je )[]} , n ) , "dépisté" ) ,
"dépisté"
)
)
)
) ;
// Pareil mais avec une boucle For(); code moins soigné mais probablement plus efficace que Repeat() pour un grand n
// car aucune liste intermédiaire n'est construite
dt << Nouvelle colonne ( « Dépisté 2 » ,
Personnage ,
Formule (
Local ({ je , n = Col N ( Tableau de données actuel ()) - 2 , s = "" } ,
Pour ( je = 1 , je <= n , je ++,
Si ( Colonne ( je )[] == "dépisté" ,
s = "dépisté" ;
Casser () ;
)
) ;
s ;
)
)
) ;
// Alternativement, renvoie le n° de "screened"
dt << Nouvelle colonne ( "Nb de Dépistés" ,
Numérique ,
Formule ( Local ({ je = 0 , n = Col N ( Tableau de données actuel ()) - 3 } , Somme ( Répéter ({ je ++ ; Colonne ( je )[] == "dépisté" } , n )))) ) ;
merci Jim. puisque je ne connais pas le nombre de colonnes, je vais essayer de mettre votre équation dans une expr() en utilisant une boucle for, puis de la déplacer vers l'instruction if avec un eval() de l'expression générée dans la boucle for .
J'utilise une sommation boulian pour résoudre le problème dont vous parlez.Si vous avez 4 colonnes, a,b,c,d, j'ai utilisé une formule de :
Si(sum(a=="screened",b=="screened",c=="screened",d=="screened")>0, "screened","")