J'ai un UserName variable qui contient des ID de longueur variable. Un exemple abrégé:
Comment puis-je trier toutes les lignes par variable X où les chaînes plus longues sont répertoriées en premier.
Contexte : Ceci permet de calculer les scores HEI 2015 à l'aide de la macro ASA24. Il écrit:
/*Note: Some users have found that the SAS program will drop observations from the analysis if the ID field is not the same length for all observations. To prevent this error, the observations with the longest ID length should be listed first when the data is imported into SAS. */
3 Réponses :
Voici probablement la manière la plus simple de procéder
data have; input string $; datalines; abcde ab a abcd abc ; proc sql; create table want as select * from have order by length(string) desc; quit;
Proc SQL
avec une clause ORDER BY
spécifiant une valeur de commande calculée dans une expression CASE
.
Le calcul lorsque length (X)> 8 then -length (X) else 0
garantit que les valeurs les plus longues sont en premier une fois triées et toutes les longueurs de valeur some-capping-length (8) sont traités de la même manière
ORDER BY length (X) desc, X
sélectionnerait également les valeurs X les plus longues en premier, puis par X lui-même, mais la longueur prédominerait dans l'ordre même lorsque value longueurs
data have; length X $50; input X; datalines; GFHsp036 GFHsp038 GFHsp039 GFHsp040 GFHsp0400 GFHsp0401 GFHsp0402 GFHsp04021 ; proc sql; create table want as select * from have order by case when length(x) > 8 then -length(X) else 0 end, X ; quit; proc print; var X / style=[fontfamily='Courier']; run;
La version CASE
est nécessaire si toutes les valeurs inférieures à une certaine longueur (8 dans l'exemple de code) doivent être triées par ordre alphabétique quelle que soit la longueur
Je m'attendais à ce que cela fonctionne, mais je pense que SAS tronque mes identifiants. Après le code macro, j'obtiens par exemple ID comme 47 GFHSp041 48 GFHSp041 49 GFHSp041 ... Est-ce lié à la façon dont la macro importe? Code ci-dessous: `Proc import datafile = Totals Out = Totals Dbms = csv Replace; Getnames = oui; Exécuter;
Si vous avez une question supplémentaire sur le code de macro ou l'importation de proc, posez une nouvelle question.
La réorganisation des ID n'a pas aidé dans mon cas car PROC IMPORT avait besoin de GUESSINGROWS = MAX.
Veuillez consulter ID de troncature de macros SAS
Pour savoir comment corriger les identifiants tronqués que cette question a tenté de corriger.