1
votes

Trier toutes les lignes par longueur de chaîne dans la variable X (chaînes plus longues en premier)

J'ai un UserName variable qui contient des ID de longueur variable. Un exemple abrégé:

 enter image description here

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. */

sas

0 commentaires

3 Réponses :


1
votes

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;


0 commentaires

2
votes

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;

entrez la description de l'image ici


3 commentaires

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.



0
votes

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.


0 commentaires