Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/06/2011, 14h00   #1
Invité de passage
 
Inscription : juin 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Par défaut Doublon et date

Bonjour

je débute sous sas et je voudrais réaliser une petite procédure qui me paraissait simple à réaliser mais qui est en train de me rendre dingue...
Voici mon problème :
j'ai une table de donnée avec des doublons, une ligne = 1 patient, toutes les valeurs des variables sont identiques sauf une variable date.
J'aimerais ne garder qu'une seule ligne par patient , celle avec la date la plus récente.
de plus mes dates s'affichent dans la table 19270215 (format best12.), la procedure que j'utilise habituellement pour afficher 15/02/1927 ne marche pas

Code :
1
2
3
4
DATA ;
SET;
format dtnaiss ddmmyy. ;
run;
le journal ne m'indique pas d'erreur , mais quand j'ouvre la table le format est bien ddmmyy. informat 10 mais dans la table il est toujours indiqué 19270215.
Quelqu’un aurait-il la formule magique pour tous ces problemes ?

merci infiniment.
guiom2510 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h09   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Hello,
Pas de formule magique mais du code SAS,

Ton problème tu peux le scinder en deux problèmes.
1 celui des transformation des dates.
2 celui de select , retain, by de l'étape data.

Donnes un exemple de donnée. On essaiera de t'aider.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h10   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Pour garder le dernier enrégistrement par patient, faut proceder comme ceci:
Code :
1
2
3
4
5
6
7
8
9
proc sort DATA=test;
BY patient;
run;
 
DATA test;
SET test;
BY patient;
IF last.patient
run;
Par contre pour ton problème de format, je ne vois pas ce qui cloche
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h12   #4
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
pour les dates in faut qu'il combine, put , substr, et la fonction MDY.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h16   #5
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Visiblement la variable date est déjà en numérique donc pas besoin de faire un substr, mdy et autres, il suffit juste d'appliquer un de ces formats:
ddmmyy10. ou date9.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h21   #6
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
je crois que sa correspond au 15 février 1927
qu'il nous donne un exemple de données. puis la proc sort il faut trier par le patient et la date je crois non ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h39   #7
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Oui c'est ça, merci!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h42   #8
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 
DATA table1;
input var;
datalines;
19270215
;
run;
 
DATA table2;
format dat1 nldate.  dat_avec_format mmddyys10.;
SET table1;
dat1= mdy(substr(put(var,8.),5,2),substr(put(var,8.),7,2),substr(put(var,8.),1,4));
 
dat_sans_format=dat1;
dat_avec_format=dat1;
run;
pour le problème initiale.
tu peux appliquer la méthode à brice . sinon la proc sort et une proc rank.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h28   #9
Invité de passage
 
Inscription : juin 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Merci de vos reponses.

je vais essayer d'etre plus clair.

On va dire que mon fichier contient les données suivantes :
id_patient : numero d'identifiant
dtnaiss : date de naissance
dtsuiv : date de dernier suivi.

Dans la table de données que j'ai sous SAS les dates ont cette "aspect"
dtnaiss : 19540822 (soit 22/08/1957)

en allant dans attribut de colonne voila les informations que j'ai :
name : dtnaiss
label : dtnaiss
length : 8
format : BEST12
informat : 12.

si j’utilise la procédure suivante
Code :
1
2
3
4
DATA test;
SET test;
format dtnaiss  ddmmyy10.
run;
j’obtiens cela :
name : dtnaiss
label : dtnaiss
length : 8
format : DDMMYY
informat : 10.

mais dans la table , cela s'affiche toujours comme cela 19540822.
Et je ne pense pas qu'il le considère comme une date car si je calcul le délai entre dtnaiss et dtsuiv j'obtiens 140 ans...

Ensuite pour mon autre problème.
Dans mon fichier j'ai des doublons. Je peux avoir plusieurs lignes pour un même id_patient. la seul variable qui diffère est dtsuiv

id_patient = 01 ; dtnaiss=19250213 ; dtsuivi=20050415
id_patient = 01 ; dtnaiss=19250213 ; dtsuivi=20070812

je souhaiterais éliminer du fichier les lignes avec la date la plus ancienne, et conserver les lignes avec les dates les plus recentes.
une des solutions que j'envisageait était de dire que pour chaque ligne ou id_patient avait la même valeur dtsuivi prenait la valeur maximal.
si je reprend mon exemple :

id_patient = 01 ; dtnaiss=19250213 ; dtsuivi=20050415
id_patient = 01 ; dtnaiss=19250213 ; dtsuivi=20070812

devenait:

id_patient = 01 ; dtnaiss=19250213 ; dtsuivi=20070812
id_patient = 01 ; dtnaiss=19250213 ; dtsuivi=20070812

et je supprime une des lignes avec une procedure de gestion des doublons que l'on peut trouver facilement sur internet...

mais je ne trouve pas comme rédiger la procedure de modification de valeur des dates.

J'espere que j'ai ete plus comprehensible...
guiom2510 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h41   #10
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Pour commencer , tes problèmes de dates.
As tu essayé d'appliquer le code que je t'ai donné ? car c'est exactement ce que tu dois faire.
Pour ton deuxième problème. Le mieux pour nous les utilisateurs et autres , c'est que t'ouvres un autre topic ( poste).
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h44   #11
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Je pense que 19540822 est trop grand pour une date, tu constateras que pour 19540, il attribue bien le format.

Code :
1
2
3
4
5
6
7
8
DATA test;
input dtnaiss;
format dtnaiss ddmmyy10.;
cards;
19540822 
19540 
;
run;

Pour le deuxième point, je t'avais proposé ça:

Code :
1
2
3
4
5
6
7
8
9
proc sort DATA=test;
BY patient datenaiss;
run;
 
DATA test;
SET test;
BY patient;
IF last.patient;
run;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h48   #12
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
je voie
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h48   #13
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
les dates sous sas sont des nombres, auquel on applique un format. Suivant le parmetrage, si ta variable a pour valeur 1 et un format de date (comme ddmmyy10.), ta table affichera premier janvier, si elle a pour valeur 2, elle affichera 2 janvier, etc.

Comme le disait sam, il faut utiliser la fonction mdy, mais comme ta variable est de TYPE numerique, il faut modifier un peu l'approche..

par exemple:


Code :
1
2
3
4
5
6
7
8
9
10
11
DATA table2;
SET table1;
 
format nvdate ddmmyy10.;
 
annee=floor(var/10000);
mois=floor((var-10000*annee)/100);
jour=(var-10000*annee-100*mois);
 
nvdate=mdy(mois,jour,annee);
run;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h56   #14
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Salut Manoutz,
Comment isoler le jour, mois et l'année à partir de 19540822 ?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h59   #15
Nouveau Membre du Club
 
Homme Gaëtan
Inscription : avril 2011
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Gaëtan
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 29
Points : 26
Points : 26
Pour ton problème de date le problème c que tu modifies le FORMAT et pas le INFORMAT, essaye ça pour voir :

Code :
1
2
3
4
5
6
 
DATA test;
SET test;
informat dtnaiss yymmdd8.;
format dtnaiss ddmmyy10.;
run;
Et pour ton 2° problème t'as plus qu'a utiliser le code de MEGAMIND2 :

Code :
1
2
3
4
5
6
7
8
9
proc sort DATA=test;
BY patient datenaiss;
run;
 
DATA test;
SET test;
BY patient;
IF last.patient;
run;
boutchiwah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 17h07   #16
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
@MGMD: tout est dans mon code. C'est une question d'unites. Pour les annees les unites sont d'unite 10000, les mois 100, et les jours 1

Le reste c'est juste du jonglage. on egalement recuperer le "reste" avec la fonction mod.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 17h08   #17
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Moi je dirais que ce chiffre est trop grand pour être considéré comme une date par SAS.
regarde sur cet exemple

Code :
1
2
3
4
5
6
7
8
DATA test;
input dtnaiss;
format dtnaiss ddmmyy10.;
cards;
19540822 
19540 
;
run;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 17h10   #18
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
lance mon code pour te prouver du contraire
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 17h11   #19
Invité de passage
 
Inscription : juin 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
@sam
Desole mais je n'arrive pas a comprendre ta procedure...
dans ton code à quoi correspond ma variable dtnaiss ?


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DATA table1;
input var;
datalines;
19270215
;
run;
 
DATA table2;
format dat1 nldate.  dat_avec_format mmddyys10.;
SET table1;
dat1= mdy(substr(put(var,8.),5,2),substr(put(var,8.),7,2),substr(put(var,8.),1,4));
 
dat_sans_format=dat1;
dat_avec_format=dat1;
run;
guiom2510 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 17h21   #20
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Désolé Manoutz et Sam, je viens de comprendre (j'ai considéré cette variable comme un nombre et non une suite de date).
La solution proposée par Sam est pas mal!

@Guiom5210 var=dtnaiss dans le programme de Sam!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h55.


 
 
 
 
Partenaires

Hébergement Web