Bonjour,
J'ai trouvé une discussion de 2015 (sujet "sumif") qui contient un script très utile pour ma tâche actuelle. J'y ai écrit ma question mais je ne sais pas si les personnes qui ont participé à cette discussion peuvent voir ma question.
Ce script que j'ai trouvé (légèrement modifié) et il fonctionne très bien pour compter les colonnes pour chaque ligne où les valeurs sont "0/0" (ou autre).
dt << New Column("Sum",
Numeric, Formula(
Local({i = 0, n = N Col(Current Data Table()) - 1},
Sum(Repeat({i++ ; (Column(i)[] =="0/0")}, n))
)
)
);Cependant, comment modifier ce script pour compter les colonnes contenant « some_character » ?
J'ai joint un tableau de données où la dernière colonne "Somme" contient une formule et les nombres résultants nécessaires.
J'ai une table Big Data et j'aimerais avoir un script pour compter les colonnes pour chaque ligne avec des valeurs spécifiques (en tant que caractère).
J'ai essayé de modifier le script ci-dessus mais cela ne fonctionne pas :
dt << New Column("Miss",
Numeric, Formula(
Local({i = 0, n = N Col(Current Data Table()) - 1},
Sum(Repeat({i++ ; (Contains(Column(i)[],"."))}, n))
)
)
);</CODE>Please, help</P><P>Valentina</P></LINGO-BODY><LINGO-LABS id="lingo-labs-737490" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisation et scripts</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-737514" slang="en-US" mode="CREATE">Re : sumif : compter les colonnes si elles contiennent un caractère</LINGO-SUB><LINGO-BODY id="lingo-body-737514" slang="en-US" mode="CREATE"><P>Avez-vous besoin d'une formule pour cela ?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737576" slang="en-US" mode="CREATE">Re : sumif : compter les colonnes si elles contiennent un caractère</LINGO-SUB><LINGO-BODY id="lingo-body-737576" slang="en-US" mode="CREATE"><P>Désolé, je ne comprends pas votre question.</P><P>J'ai un tableau d'environ 500 000 lignes et environ 3 000 colonnes. Je dois calculer la somme sur les colonnes contenant un point – je ne peux pas utiliser de formule. .</P><P>Je veux avoir un script, n’importe quel script qui fonctionnerait. J'ai essayé différentes approches mais aucune n'a fonctionné. .</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737577" slang="en-US" mode="CREATE">Re : sumif : compter les colonnes si elles contiennent un caractère</LINGO-SUB><LINGO-BODY id="lingo-body-737577" slang="en-US" mode="CREATE"><P>Ceci vient de mon journal :</P><P> </P><P>Formule de somme de colonnes interrompue<BR /> l'argument est de type incorrect à la ligne 421001 lors de l'accès ou de l'évaluation de 'Contient' , Bad Argument( Column( i )[] ), Contains/*###*/(Column( i )[], ".")<BR /> Les erreurs d'évaluation des formules ont été ignorées</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737582" slang="en-US" mode="CREATE">Re : sumif : compter les colonnes si elles contiennent un caractère</LINGO-SUB><LINGO-BODY id="lingo-body-737582" slang="en-US" mode="CREATE"><P>Il est fort probable que votre boucle atteigne une colonne qui n'est pas une colonne de caractères. Cette partie nécessite probablement quelques modifications</P>
<PRE><CODE class=" language-jsl">n = N Col(Current Data Table()) - 1
il est très difficile de savoir comment cela doit être fait sans aucune connaissance de vos données. Il peut s'agir simplement d'une simple modification du -1, d'obtenir une liste de colonnes de caractères ou de calculer les colonnes à parcourir selon une sorte de modèle.
J'ai joint un petit tableau de données à mon message. Il comporte 3 lignes et 3 colonnes avec un en-tête :
S1 S2 S3
0/0./. 0/0
./. ./. ./.
0/0 0/0 0/0
Le script ne fonctionne pas dans cet exemple de table
Somme des colonnes Formule interrompue
l'argument est de mauvais type à la ligne 1 lors de l'accès ou de l'évaluation de 'Contient' , Bad Argument( Column( i )[] ), Contains/*###*/(Column( i )[], ".")
Les erreurs d'évaluation des formules ont été ignorées
Le tableau de données d'origine que vous avez joint n'était pas comme ça car il comporte 4 colonnes (vous ne pouvez pas ignorer la colonne Somme)

En fonction de vos données, voici comment je procéderais si je devais utiliser une formule (j'éviterais probablement cela et utiliserais simplement une solution de script pur)
Names Default To Here(1);
dt = Open("$DOWNLOADS/sum_help_data.jmp");
dt << Delete Column("Sum");
dt << New Column("Miss", Numeric, Continuous, Formula(
As Constant(
cols_of_interest = Filter Each({colname}, Current Data Table() << Get Column Names("String"),
!IsMissing(Regex(colname, "S\d"));
);
);
Local({
res = 0;
},
For Each({colname}, cols_of_interest,
res = res + (Contains(Column(colname)[], ".") > 0);
);
res;
);
));
Oui, il semble que toutes les données devraient être du même type.
Merci - ça marche !