The CARDINALITY procedure analyzes a variable in a CAS dataset to determine its number of unique levels (cardinality). When user-defined formats are applied to a variable, the procedure treats these formats as prior knowledge and uses them by default to order the levels. This example focuses on the engineSize variable from the SASHELP.CARS dataset, to which an engsize format is applied. The output includes the cardinality of the formatted variable and a detailed table of frequencies for each formatted level.
Data Analysis
Type : SASHELP
The examples use the built-in SASHELP.CARS dataset, which is loaded into a CAS session, and internally created data (datalines) for format demonstrations.
1 Code Block
PROC CARDINALITY Data
Explanation : This basic example shows how to define a user-defined format for the 'engineSize' variable and how the CARDINALITY procedure uses it by default to calculate cardinality. It loads the 'sashelp.cars' dataset into a CAS session, creates an 'engsize' format, applies it to 'engineSize', and then executes PROC CARDINALITY. The results (_VARNAME_, _ORDER_, _MORE_, _CARDINALITY_, _INDEX_, _FREQ_, _CFMT_) are then displayed to confirm that the format has been taken into account and that the levels are ordered according to the format labels.
Copied!
/* 1. Charger le jeu de données SASHELP.CARS en session CAS */
proc cas;
session casauto;
caslib _all_ assign;
data casuser.cars;
set sashelp.cars;
run;
quit;
/* 2. Créer un format défini par l'utilisateur pour engineSize */
proc format casfmtlib='casuser.myfmtlib';
value engsize
low - <3 = 'Petit moteur'
3 - <6 = 'Moteur moyen'
6 - high= 'Gros moteur';
run;
/* 3. Appliquer le format à la variable engineSize et charger en CAS */
data casuser.cars;
format engineSize engsize.;
set casuser.cars;
run;
/* 4. Exécuter PROC CARDINALITY avec la variable formatée */
proc cardinality data=casuser.cars outcard=casuser.card outdetails=casuser.details;
var engineSize;
run;
/* 5. Afficher le résumé de cardinalité */
title 'Cardinalité de engineSize avec format défini par l''utilisateur (Basique)';
proc print data=casuser.card;
var _VARNAME_ _ORDER_ _MORE_ _CARDINALITY_;
run;
/* 6. Afficher les détails des niveaux formatés */
title 'Détails des niveaux formatés pour engineSize (Basique)';
proc print data=casuser.details;
var _VARNAME_ _INDEX_ _FREQ_ _CFMT_;
run;
1
/* 1. Charger le jeu de données SASHELP.CARS en session CAS */
2
PROC CAS;
3
SESSION casauto;
4
caslib _all_ assign;
5
DATA casuser.cars;
6
SET sashelp.cars;
7
RUN;
8
QUIT;
9
10
/* 2. Créer un format défini par l'utilisateur pour engineSize */
11
PROC FORMAT casfmtlib='casuser.myfmtlib';
12
value engsize
13
low - <3 = 'Petit moteur'
14
3 - <6 = 'Moteur moyen'
15
6 - high= 'Gros moteur';
16
RUN;
17
18
/* 3. Appliquer le format à la variable engineSize et charger en CAS */
19
DATA casuser.cars;
20
FORMAT engineSize engsize.;
21
SET casuser.cars;
22
RUN;
23
24
/* 4. Exécuter PROC CARDINALITY avec la variable formatée */
title 'Cardinalité de engineSize avec format défini par l''utilisateur (Basique)';
31
PROC PRINTDATA=casuser.card;
32
var _VARNAME_ _ORDER_ _MORE_ _CARDINALITY_;
33
RUN;
34
35
/* 6. Afficher les détails des niveaux formatés */
36
title 'Détails des niveaux formatés pour engineSize (Basique)';
37
PROC PRINTDATA=casuser.details;
38
var _VARNAME_ _INDEX_ _FREQ_ _CFMT_;
39
RUN;
2 Code Block
PROC CARDINALITY Data
Explanation : This intermediate example uses a user-defined format that includes missing value handling. It applies the format, intentionally introduces missing values into the 'engineSize' variable, and then executes PROC CARDINALITY with the `ORDER=FORMATTED` option to ensure that level ordering is explicitly based on the format labels, including the level for missing values.
Copied!
/* 1. Charger le jeu de données SASHELP.CARS en session CAS */
proc cas;
session casauto;
caslib _all_ assign;
data casuser.cars;
set sashelp.cars;
run;
quit;
/* 2. Créer un format défini par l'utilisateur pour engineSize avec une valeur manquante */
proc format casfmtlib='casuser.myfmtlib';
value engsize_plus
low - <3 = 'Type A'
3 - <6 = 'Type B'
6 - high= 'Type C'
. = 'Non spécifié'; /* Gestion des valeurs manquantes */
run;
/* 3. Appliquer le format et introduire des valeurs manquantes */
data casuser.cars_missing;
set casuser.cars;
if mod(_n_, 10) = 0 then call missing(engineSize); /* Introduire des manquants */
format engineSize engsize_plus.;
run;
/* 4. Exécuter PROC CARDINALITY avec ORDER=FORMATTED */
proc cardinality data=casuser.cars_missing outcard=casuser.card_ord outdetails=casuser.details_ord;
var engineSize;
order formatted;
run;
/* 5. Afficher le résumé de cardinalité */
title 'Cardinalité de engineSize avec format défini par l''utilisateur et manquants (Ordonné par format)';
proc print data=casuser.card_ord;
var _VARNAME_ _ORDER_ _MORE_ _CARDINALITY_;
run;
/* 6. Afficher les détails des niveaux formatés */
title 'Détails des niveaux formatés pour engineSize avec manquants (Ordonné par format)';
proc print data=casuser.details_ord;
var _VARNAME_ _INDEX_ _FREQ_ _CFMT_;
run;
1
/* 1. Charger le jeu de données SASHELP.CARS en session CAS */
2
PROC CAS;
3
SESSION casauto;
4
caslib _all_ assign;
5
DATA casuser.cars;
6
SET sashelp.cars;
7
RUN;
8
QUIT;
9
10
/* 2. Créer un format défini par l'utilisateur pour engineSize avec une valeur manquante */
11
PROC FORMAT casfmtlib='casuser.myfmtlib';
12
value engsize_plus
13
low - <3 = 'Type A'
14
3 - <6 = 'Type B'
15
6 - high= 'Type C'
16
. = 'Non spécifié'; /* Gestion des valeurs manquantes */
17
RUN;
18
19
/* 3. Appliquer le format et introduire des valeurs manquantes */
20
DATA casuser.cars_missing;
21
SET casuser.cars;
22
IF mod(_n_, 10) = 0 THEN call missing(engineSize); /* Introduire des manquants */
23
FORMAT engineSize engsize_plus.;
24
RUN;
25
26
/* 4. Exécuter PROC CARDINALITY avec ORDER=FORMATTED */
title 'Cardinalité de engineSize avec format défini par l''utilisateur et manquants (Ordonné par format)';
34
PROC PRINTDATA=casuser.card_ord;
35
var _VARNAME_ _ORDER_ _MORE_ _CARDINALITY_;
36
RUN;
37
38
/* 6. Afficher les détails des niveaux formatés */
39
title 'Détails des niveaux formatés pour engineSize avec manquants (Ordonné par format)';
40
PROC PRINTDATA=casuser.details_ord;
41
var _VARNAME_ _INDEX_ _FREQ_ _CFMT_;
42
RUN;
3 Code Block
PROC CARDINALITY Data
Explanation : This advanced example combines the use of user-defined formats with data filtering and the analysis of multiple variables. It creates formats for 'driveTrain' and 'fueltype', applies a complex `WHERE` filter to select a subset of vehicles, and then executes PROC CARDINALITY on these variables. The `ORDER=FREQ` option is used to order levels by decreasing frequency, and `MAXLEVELS` is adjusted to obtain more detailed level information.
Copied!
/* 1. Charger le jeu de données SASHELP.CARS en session CAS */
proc cas;
session casauto;
caslib _all_ assign;
data casuser.cars;
set sashelp.cars;
run;
quit;
/* 2. Créer un format défini par l'utilisateur complexe */
proc format casfmtlib='casuser.myfmtlib';
value $fueltype
'Premium' = 'Carburant Premium'
'Regular' = 'Carburant Régulier'
other = 'Autre Carburant';
value $drivetrain
'Front' = 'Traction avant'
'Rear' = 'Propulsion'
'All' = 'Quatre roues motrices'
other = 'Inconnu';
run;
/* 3. Appliquer les formats et filtrer les données */
data casuser.cars_filtered;
set casuser.cars;
format driveTrain $drivetrain. fueltype $fueltype.;
where msrp < 30000 and make in ('Audi', 'BMW', 'Mercedes-Benz'); /* Filtrage avancé */
run;
/* 4. Exécuter PROC CARDINALITY sur plusieurs variables formatées */
proc cardinality data=casuser.cars_filtered outcard=casuser.card_adv outdetails=casuser.details_adv maxlevels=10;
var driveTrain fueltype;
order freq; /* Ordonner par fréquence */
run;
/* 5. Afficher les résultats */
title 'Cardinalité des variables formatées (Cas Avancé avec filtrage)';
proc print data=casuser.card_adv;
var _VARNAME_ _ORDER_ _MORE_ _CARDINALITY_;
run;
title 'Détails des niveaux formatés (Cas Avancé avec filtrage)';
proc print data=casuser.details_adv;
var _VARNAME_ _INDEX_ _FREQ_ _CFMT_;
run;
1
/* 1. Charger le jeu de données SASHELP.CARS en session CAS */
2
PROC CAS;
3
SESSION casauto;
4
caslib _all_ assign;
5
DATA casuser.cars;
6
SET sashelp.cars;
7
RUN;
8
QUIT;
9
10
/* 2. Créer un format défini par l'utilisateur complexe */
11
PROC FORMAT casfmtlib='casuser.myfmtlib';
12
value $fueltype
13
'Premium' = 'Carburant Premium'
14
'Regular' = 'Carburant Régulier'
15
other = 'Autre Carburant';
16
17
value $drivetrain
18
'Front' = 'Traction avant'
19
'Rear' = 'Propulsion'
20
'All' = 'Quatre roues motrices'
21
other = 'Inconnu';
22
RUN;
23
24
/* 3. Appliquer les formats et filtrer les données */
25
DATA casuser.cars_filtered;
26
SET casuser.cars;
27
FORMAT driveTrain $drivetrain. fueltype $fueltype.;
28
where msrp < 30000 and make in ('Audi', 'BMW', 'Mercedes-Benz'); /* Filtrage avancé */
29
RUN;
30
31
/* 4. Exécuter PROC CARDINALITY sur plusieurs variables formatées */
title 'Cardinalité des variables formatées (Cas Avancé avec filtrage)';
39
PROC PRINTDATA=casuser.card_adv;
40
var _VARNAME_ _ORDER_ _MORE_ _CARDINALITY_;
41
RUN;
42
43
title 'Détails des niveaux formatés (Cas Avancé avec filtrage)';
44
PROC PRINTDATA=casuser.details_adv;
45
var _VARNAME_ _INDEX_ _FREQ_ _CFMT_;
46
RUN;
4 Code Block
PROC CARDINALITY Data
Explanation : This Viya/CAS scenario is optimized for large tables. It simulates a large data table directly in a CAS session, applies user-defined formats to numeric and character variables, and then executes PROC CARDINALITY. The `NTHREADS` option is specifically used to leverage CAS's parallel processing capabilities, which is crucial for performance on large datasets. The `ESTIMATE METHOD=EXACT` option ensures accurate cardinality calculation, even with large data. After analysis, temporary tables are dropped.
Copied!
/* 1. Créer une grande table CAS pour la démonstration */
proc cas;
session casauto;
caslib _all_ assign;
data casuser.large_data;
do i = 1 to 100000; /* 100 000 observations */
engineSize_raw = ranuni(12345) * 10; /* Générer des tailles moteur continues */
if engineSize_raw < 3 then engineSize = 1; /* Simuler des groupes pour le format */
else if engineSize_raw < 6 then engineSize = 2;
else engineSize = 3;
fueltype_raw = rand('UNIFORM') * 3;
if fueltype_raw < 1 then fueltype_char = 'Premium';
else if fueltype_raw < 2 then fueltype_char = 'Regular';
else fueltype_char = 'Diesel';
output;
end;
run;
quit;
/* 2. Créer les formats définis par l'utilisateur */
proc format casfmtlib='casuser.myfmtlib';
value large_engsize
1 = 'Petite Moteur (CAS)'
2 = 'Moteur Moyen (CAS)'
3 = 'Gros Moteur (CAS)';
value $large_fueltype
'Premium' = 'Carburant Premium (CAS)'
'Regular' = 'Carburant Régulier (CAS)'
'Diesel' = 'Carburant Diesel (CAS)';
run;
/* 3. Appliquer les formats à la grande table CAS */
data casuser.large_data;
set casuser.large_data;
format engineSize large_engsize. fueltype_char $large_fueltype.;
run;
/* 4. Exécuter PROC CARDINALITY en parallèle sur la grande table */
proc cardinality data=casuser.large_data outcard=casuser.card_large outdetails=casuser.details_large;
var engineSize fueltype_char;
nthreads=4; /* Utilisation de threads pour une exécution parallèle */
estimate method=exact; /* Assurer un calcul exact de cardinalité */
run;
/* 5. Afficher les résultats pour la table volumineuse */
title 'Cardinalité des variables formatées sur une table volumineuse (CAS/Parallèle)';
proc print data=casuser.card_large;
var _VARNAME_ _ORDER_ _MORE_ _CARDINALITY_;
run;
title 'Détails des niveaux formatés sur une table volumineuse (CAS/Parallèle)';
proc print data=casuser.details_large;
var _VARNAME_ _INDEX_ _FREQ_ _CFMT_;
run;
/* 6. Supprimer la table temporaire */
proc cas;
session casauto;
table.dropTable(name='large_data', caslib='casuser');
table.dropTable(name='card_large', caslib='casuser');
table.dropTable(name='details_large', caslib='casuser');
quit;
1
/* 1. Créer une grande table CAS pour la démonstration */
This material is provided "as is" by We Are Cas. There are no warranties, expressed or implied, as to merchantability or fitness for a particular purpose regarding the materials or code contained herein. We Are Cas is not responsible for errors in this material as it now exists or will exist, nor does We Are Cas provide technical support for it.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.