effectuer une évaluation de calcul dans un tableau associatifBonjour,
J'essaie d'obtenir une fonction pour renvoyer un calcul d'écart type stocké dans un tableau associatif, mon code ne renverra que l'expression du tableau associatif et non le calcul.pourriez-vous s'il vous plaît me dire ce qui ne va pas avec mon code.
cvf = Max ( réponse ) ;// mon cvf dans le fichier est 8
CV = Tableau associatif () ;
CV [ 6 ] = Tableau associatif ({( Dév Std ( 5 , 6 , 7 , 8 , 9 , dix ))}) ;
CV [ 8 ] = Tableau associatif ({( Dév Std ( 5 , 6 , 7 , 8 , 9 , dix , 11 , 12 ))}) ;
CV [ 12 ] = Tableau associatif ({( Dév Std ( 5 , 6 , 7 , 8 , 9 , dix , 11 , 12 , 13 , 14 , 15 , 16 ))}) ;
CVC = Fonction ( { réf } , Local ({ CV = Tableau associatif ({ cvf , Éval ( cvf )} )} , CV << obtenir des valeurs ( cvf )) ; CV [ réf ]) ; ) ;
un = CVC ( cvf ) ;
eval ( eval expr ( un )) ;
Afficher(a);
voici la sortie que j'obtiens :
a = Tableau associatif({{Std Dev( 5, 6, 7, 8, 9, 10, 11, 12 ), 1}}, 0);
c'est la sortie que je veux : a= 2.5
Re : effectuer une évaluation de calcul dans un tableau associatifSummarize(age grp) est une liste de deux listes et n'est pas compatible avec Associative array(age grp). avg et sd sont également dans une seule liste qui n'est pas compatible pour les références croisées avec le résumé (groupe d'âge). Le code ci-dessous aligne les listes correctement (pas joli)
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( sum = By( :age),sex grp= By (:sex), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
sex grp = Associative Array( :sex ) << Get Keys;
dt << New Column( "CV" ) << New Column( "AVG" ) << New Column( "SD" );
For( g = 1, g <= nitems(age grp), g++,
For(i =1, i<=nitems(sex grp), i++,
rows = dt << get rows where( :age == age grp[g] & :sex == sex grp[i] );
if( i==1,
:AVG[rows] = avg[ g*2-1 ];
:SD[rows] = sd[ g*2-1 ];
:CV[rows] = 100 * avg[ g*2-1 ] / sd[ g*2-1 ];
,
:AVG[rows] = avg[ g*i ];
:SD[rows] = sd[ g*i ];
:CV[rows] = 100 * avg[ g*i ] / sd[ g*i ];
)));
Re : effectuer une évaluation de calcul dans un tableau associatifMerci, ça marche
Re : effectuer une évaluation de calcul dans un tableau associatifJe ne sais pas quand il est apparu, mais pour info, je viens de remarquer que dans ma version de JMP (13), "CV" est l'une des statistiques fournies par "Tables > Summary". La colonne de formule n'est donc pas nécessaire.
Re : effectuer une évaluation de calcul dans un tableau associatifJe m'excuse d'avoir manqué le fait que vous avez deux variables de regroupement. Ce script modifié vous montrera comment cela fonctionne.
Names Default to Here( 1 );
// Open example of a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Estimate group statistics and group identities
Summarize( age sex grp = By( :age, :sex ), avg = Mean( :height ), sd = Std Dev( :height ) );
// Make a new columns for group result
dt << New Column( "Avg" ) << New Column( "SD" ) << New Column( "CV" );
// Iterate over groups
For( g = 1, g <= N Items( age grp ), g++,
// Convert :age level to match data type of identity
rows = dt << Get Rows Where( Char( :age ) == age sex grp[1][g] & :sex == age sex grp[2][g] );
:Avg[rows] = avg[g];
:SD[rows] =sd[g];
:CV[rows] = 100 * sd[g] / avg[g];
);
Je ne pense pas qu'un tableau associatif soit le moyen le plus efficace d'identifier les groupes. La fonction Summarize() estime simultanément les statistiques du groupe et identifie le groupe associé à l'aide de deux listes parallèles de niveaux de groupe. Le seul inconvénient, à mon avis, est que les niveaux de regroupement sont toujours des chaînes de caractères même si les niveaux d'origine sont numériques, tels que les niveaux d'âge dans ce cas. J'ai donc dû convertir le niveau d'âge pour la comparaison utilisée pour obtenir les numéros de ligne cibles.
Vous avez maintenant deux approches, y compris la solution de Ian utilisant Summary command\.
Re : effectuer une évaluation de calcul dans un tableau associatifVous pouvez essayer de voir si c'est plus efficace (ce à quoi je pourrais m'attendre):
Names Default To Here( 1 );
// Example table
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Edit to taste . . .
var = Column(dt, "height");
byVars = {Column(dt, "sex"), Column(dt, "age")};
// Use a summary table with formula column
dt2 = dt << Summary(Group(byVars), Mean(var), Std Dev(var));
Column(dt2, 4) << setName("Mean");
Column(dt2, 5) << setName("StdDev");
dt2 << New Column( "CV", Numeric, "Continuous", Format( "Percent", 12, 3 ), Formula(:StdDev/:Mean));
Si vous avez besoin des valeurs de CV dans la table d'origine, utilisez 'Tables > Join'.
Re : effectuer une évaluation de calcul dans un tableau associatifSalut Mark ,
J'utilise votre exemple et je suis capable d'obtenir correctement le numéro de ligne, mais la moyenne et l'écart type ne sont pas corrects. Et ma table fait plus de 10 000 lignes, le calcul est un peu lent. Pourriez-vous s'il vous plaît me dire où ai-je fait une erreur? merci.
Noms par défaut ici ( 1 ) ;
dt = Ouvrir ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
Résumer ( groupe d'âge = Par ( : âge ) , groupe de sexe = Par ( : sexe ) , moyenne = Moyenne ( : hauteur ) , Dakota du Sud = Dév Std ( : hauteur ) ) ;
groupe d'âge = Tableau associatif ( : âge ) << Obtenir des clés ;
groupe de sexe = Tableau associatif ( : sexe ) << Obtenir des clés ;
dt << Nouvelle colonne ( "CV" ) ;
Pour ( g = 1 , g <= articles ( groupe d'âge ) , g ++,
pour ( je = 1 , je <= articles ( groupe de sexe ) , je ++,
Lignes = dt << obtenir des lignes où ( : âge == groupe d'âge [ g ] & : sexe == groupe de sexe [ je ]) ;
: CV [ Lignes ] = 100 * Dakota du Sud [ je ] / moyenne [ je ] ;
)) ;
Re : effectuer une évaluation de calcul dans un tableau associatifMerci, c'est ce que je recherche. merci.
Shu
Re : effectuer une évaluation de calcul dans un tableau associatifEssayez cet exemple :
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( age grp = By( :age ), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
dt << New Column( "CV" );
For( g = 1, g <= N Items( age grp ), g++,
rows = dt << Get Rows Where( :age == age grp[g] )
:CV[rows] = 100 * sd[g] / avg[g];
);
Re : effectuer une évaluation de calcul dans un tableau associatifil y a trois colonnes dans une table de données, et l'une indiquera le numéro de réplique, et l'autre aura une sortie de signal pour la réplique, et la dernière aura le dataID. et j'ai besoin de calculer l'écart type pour tous les dataID. toutes les données n'auront que deux répliques, à l'exception d'un type spécifique nommé "Titre" et selon l'endroit où les données sont générées, le type de données "Titre" peut avoir 6, 8 ou 12 répliques. par conséquent, je crée ces trois cas sous forme de tableau et les lie à la colonne répliquée.
mon code et renvoie la formule au calcul d'attente standard, cependant, lorsque je les mets dans une nouvelle colonne pour le calcul du CV, cela ne fait rien.
l'autre option que je peux penser utilise la plate-forme Tabuler pour obtenir l'écart type et les mettre dans un tableau et les réaffecter à la nouvelle colonne. Toute suggestion?
Re : effectuer une évaluation de calcul dans un tableau associatifRecommençons.
- Qu'essayez-vous de faire?
- À quoi ressemblent vos données ?
- Comment est-il organisé ?
- De quels résultats avez-vous besoin ?
- Que voulez-vous faire des résultats ?
Il n'est pas clair pour moi que vous deviez utiliser un tableau associatif.
Re : effectuer une évaluation de calcul dans un tableau associatifJ'ai compris mon problème, mais j'ai un nouveau problème.
mon tableau associatif est une formule et je dois récupérer la clé pour effectuer le calcul.
mon code renverra a, qui est la formule sur la façon de calculer l'écart type. mais quand je mets la formule dans une nouvelle formule, la nouvelle formule n'effectue pas le calcul.
un = CVC ( cvf ) << obtenir des clés ( cvf ) ;
montrer ( un ) ;// c'est la formule avec un :
{Std Dev(:INSTRUMENT_SIGNAL[Row() + 8], :INSTRUMENT_SIGNAL[Row() + 1], :INSTRUMENT_SIGNAL[Row() + 2], :INSTRUMENT_SIGNAL[Row() + 3], :INSTRUMENT_SIGNAL[Row() + 4], :INSTRUMENT_SIGNAL[Ligne() + 5], :INSTRUMENT_SIGNAL[Ligne() + 6], :INSTRUMENT_SIGNAL[Ligne() + 7])} ;
mais une fois que j'ai mis a dans la nouvelle formule ci-dessous : a ferait le calcul. S'il vous plaît aidez-moi!
c ol 2 << définir la formule ( Si ( : RUNSAMPLEKIND == "TITERC.NEG" , ( un / : Signal moyen ) * 100 ) ,
Si ( : RUNSAMPLEKIND [ Ligne ()] == : RUNSAMPLEKIND [ Ligne () + 1 ] ,
Si ( : REPRÉSENTANT [ Ligne ()] != 2 , ( Dév Std ( : INSTRUMENT_SIGNAL [ Ligne () + 1 ] , : INSTRUMENT_SIGNAL [ Ligne ()] ) / : Signal moyen ) * 100 ) ) ) ;