L'analyse fonctionnelle se concentre sur l'identification et la résolution des défis liés à la fusion de jeux de données. Elle couvre l'utilisation de PROC CONTENTS et PROC PRINT pour l'examen initial des données, PROC SQL pour la détection de variables communes, et des étapes DATA avec des fonctions comme CATX et INPUT, ainsi que les instructions LENGTH et ATTRIB, pour uniformiser les attributs des variables. Les exemples illustrent comment gérer les différences de type, de longueur, de format et de libellé des variables, et comment créer des identifiants uniques pour les valeurs BY en double afin d'assurer des opérations de fusion correctes. Les relations entre les jeux de données (un-à-plusieurs, plusieurs-à-un, un-à-un) sont également abordées, soulignant l'importance d'une préparation adéquate pour chaque méthode de combinaison.
Analyse des données
Type : CREATION_INTERNE
Les exemples utilisent des données générées (datalines) ou SASHELP, ainsi que des jeux de données prédéfinis comme Inventory, Sales, Sales2019, CarsSmall, Class et Classfit, créés en interne pour les besoins de la démonstration.
1 Bloc de code
PROC CONTENTS / PROC SORT / PROC PRINT Data
Explication : Visualise les informations descriptives des jeux de données d'entrée pour identifier les variables communes et compare leurs attributs. Trie les jeux de données par la variable PartNumber. Imprime les jeux de données pour examiner les valeurs de la variable commune et déterminer la relation entre les jeux de données.
Explication : Crée une table temporaire 'commonvars' à partir des colonnes des jeux de données 'INVENTORY', 'SALES' et 'SALES2019' dans la bibliothèque WORK. Sélectionne ensuite les noms de variables qui sont communs à tous ces jeux de données en groupant par nom et en vérifiant que le compte correspond au nombre de jeux de données uniques.
Copié !
proc sql;
title "Variables Common to Inventory, Sales, and Sales2019";
create table commonvars as
select memname, upcase(name) as name
from dictionary.columns
where libname='WORK' and
memname in ('INVENTORY', 'SALES', 'SALES2019');
select name
from commonvars
group by name
having count(*)=(select count(distinct(memname)) from commonvars);
quit;
1
PROC SQL;
2
title "Variables Common to Inventory, Sales, and Sales2019";
3
create TABLE commonvars as
4
select memname, upcase(name) as name
5
from dictionary.columns
6
where LIBNAME='WORK' and
7
memname in ('INVENTORY', 'SALES', 'SALES2019');
8
select name
9
from commonvars
10
group BY name
11
having count(*)=(select count(distinct(memname)) from commonvars);
12
QUIT;
3 Bloc de code
PROC SORT / PROC FREQ / DATA STEP Data
Explication : Trie les données de vente par 'partNumber'. Utilise PROC FREQ pour identifier les doublons de 'partNumber' et les stocke dans 'SalesDupes'. Ensuite, dans une étape DATA, crée un nouvel identifiant unique 'uniqueID' en concaténant 'partNumber' avec le numéro d'observation automatique (_N_) à l'aide de la fonction CATX pour chaque enregistrement du jeu de données 'Sales'. Enfin, imprime le nouveau jeu de données 'SalesUnique' avec la variable 'uniqueID'.
Copié !
proc sort data=sales;
by partNumber;
run;
proc print data=sales; run;
proc freq data = Sales noprint;
tables partNumber / out = SalesDupes
(keep = partNumber Count
where = (Count > 1));
run;
proc print data=SalesDupes;run;
data SalesUnique;
set Sales;
uniqueID = catx('.',partNumber,_n_);
run;
proc print data=SalesUnique;
var uniqueID partNumber partName salesPerson;
run;
1
PROC SORTDATA=sales;
2
BY partNumber;
3
RUN;
4
PROC PRINTDATA=sales; RUN;
5
6
PROC FREQDATA = Sales noprint;
7
tables partNumber / out = SalesDupes
8
(keep = partNumber Count
9
where = (Count > 1));
10
RUN;
11
12
PROC PRINTDATA=SalesDupes;RUN;
13
14
DATA SalesUnique;
15
SET Sales;
16
uniqueID = catx('.',partNumber,_n_);
17
RUN;
18
19
PROC PRINTDATA=SalesUnique;
20
var uniqueID partNumber partName salesPerson;
21
RUN;
4 Bloc de code
DATA STEP / PROC CONTENTS / PROC MERGE Data
Explication : Crée un jeu de données 'cars' à partir de 'sashelp.cars'. Affiche les informations descriptives des jeux de données 'cars' et 'CarsSmall'. Tente de fusionner 'cars' et 'CarsSmallNum' par 'make' et 'model', mais échoue en raison de types de données incompatibles pour la variable 'Weight'.
Pour corriger le problème:
data CarsSmallNum;
set CarsSmall;
weightNum=input(weight, 8.);
drop weight;
rename WeightNum=weight;
run;
proc sort data=cars; by make model; run;
proc sort data=CarsSmallNum; by Make Model; run;
data combineCars;
merge cars CarsSmallNum;
by make model;
keep Make DriveTrain Model MakeModelDrive Weight;
run;
proc contents data=combineCars; run;
proc print data=combineCars; run;
Copié !
data cars;
set sashelp.cars;
run;
proc contents data=cars; run;
proc contents data=CarsSmall; run;
data combineCars;
merge cars CarsSmallNum;
by make model;
keep Make DriveTrain Model MakeModelDrive Weight;
run;
1
DATA cars;
2
SET sashelp.cars;
3
RUN;
4
5
PROC CONTENTSDATA=cars; RUN;
6
PROC CONTENTSDATA=CarsSmall; RUN;
7
8
DATA combineCars;
9
MERGE cars CarsSmallNum;
10
BY make model;
11
keep Make DriveTrain Model MakeModelDrive Weight;
12
RUN;
5 Bloc de code
PROC PRINT / PROC MERGE / DATA STEP Data
Explication : Imprime les jeux de données 'quarter1', 'quarter2', 'quarter3', 'quarter4'. Tente de fusionner ces jeux de données par 'Account'. La première tentative peut générer un avertissement en raison de longueurs différentes pour la variable 'Mileage'. La deuxième étape DATA utilise l'instruction LENGTH pour définir explicitement la longueur de 'Mileage' à 6 avant la fusion, garantissant une longueur cohérente dans le jeu de données 'yearly'. PROC CONTENTS est ensuite exécuté pour vérifier les attributs du jeu de données fusionné.
Explication : Visualise les informations descriptives des jeux de données 'class' et 'classfit' pour identifier les variables communes et comparer leurs attributs, en se concentrant sur les différences de formats et de libellés pour 'Height' et 'Weight'. Trie les jeux de données par 'Name'. Fusionne 'class' et 'classfit' par 'Name'. Utilise l'instruction ATTRIB pour définir explicitement le libellé de 'Weight' et le format 'comma8.2' pour 'Height', 'Weight' et 'Predict'. Imprime et affiche les attributs du jeu de données 'merged' résultant.
Copié !
proc contents data=class; run;
proc contents data=classfit; run;
proc sort data=class; by name; run;
proc sort data=classfit; by name; run;
data merged;
merge class classfit; by Name;
attrib Weight
label = "Weight";
attrib Height Weight Predict format=comma8.2;
run;
proc print data=merged;
run;
proc contents data=merged; run;
1
PROC CONTENTSDATA=class; RUN;
2
PROC CONTENTSDATA=classfit; RUN;
3
4
PROC SORTDATA=class; BY name; RUN;
5
PROC SORTDATA=classfit; BY name; RUN;
6
7
DATA merged;
8
MERGE class classfit; BY Name;
9
attrib Weight
10
label = "Weight";
11
attrib Height Weight Predict FORMAT=comma8.2;
12
RUN;
13
PROC PRINTDATA=merged;
14
RUN;
15
PROC CONTENTSDATA=merged; RUN;
7 Bloc de code
DATA STEP Data
Explication : Renomme la variable 'Weight' en 'WeightLBS' dans le jeu de données 'vehicles' lors de sa création ou modification. Ceci est fait pour différencier les variables qui ont le même nom mais représentent des données différentes, évitant ainsi des problèmes lors de la fusion avec d'autres jeux de données.
Copié !
data vehicles(rename=(weight=weightLBS));
set vehicles;
run;
1
2
DATA vehicles(rename=(weight=weightLBS));
3
SET vehicles;
4
RUN;
5
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
« Une préparation de données robuste transforme un processus fragile en un pipeline fiable. En renommant vos variables (RENAME) et en harmonisant les libellés et formats dès l'étape de fusion, vous garantissez la qualité des analyses futures. Une donnée bien préparée est une donnée déjà à moitié analysée. »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.