Calcul de dates

Questions sur les objets de R et la manipulation des données

Modérateur : Groupe des modérateurs

LA haumont
Messages : 41
Enregistré le : 16 Mai 2006, 09:33

Calcul de dates

Messagepar LA haumont » 23 Mai 2006, 13:42

bonjour,
j'ai un calcul à faire entre 2 dates . En fait, il faut que je calcule pour un même patient (sachant qu'il peut être une seule fois dans la base, ds ce cas aucun calcul nécessaire) le temps entre 2 dates . Voici ce que j'ai écrit pour le moment mais avec sans doute de nombreuses erreurs:

Code : Tout sélectionner

> if(TriNIP$NIP[IdPatient] ==TriNIP$NIP[IdPatient+1]) TriNIP$NIP <- ifelse (TriNIP$Temps <-( TriNIP$DateAngio[IdPatient+1]-TriNIP$DateAngio[IdPatient]))


Donc dans un premier temps il faut que je demande si le patient est identique , si c'est le cas il sont a suivre ! un patient peut etre une seule fois comme 7, 8 fois. Et ensuite on calcule , mais le format date doit sans doute etre changé aussi??

Exemple:
NOM Date1
a 21/02/2003
b 15/05/2000
c 12/12/2001
c 18/03/2003
d 24/11/2005

merci pour votre aide!!

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 23 Mai 2006, 14:40

Voilà un exemple traité complètement:

Code : Tout sélectionner

> Data1 <- data.frame(
+   Nom = rev(c("a", "b", "c", "c", "d")),
+   Date = rev(c("21/02/2003", "15/05/2000", "12/12/2001", "18/03/2003", "24/11/2005")))
> str(Data1)
`data.frame':   5 obs. of  2 variables:
 $ Nom : Factor w/ 4 levels "a","b","c","d": 4 3 3 2 1
 $ Date: Factor w/ 5 levels "12/12/2001","15/05/2000",..: 5 3 1 2 4
>
> # Les données sont "à l'envers"
> Data1
  Nom       Date
1   d 24/11/2005
2   c 18/03/2003
3   c 12/12/2001
4   b 15/05/2000
5   a 21/02/2003
>
> # voir l'aide de as.Date (et liens) pour explications sur la syntaxe
> Data1$Date <- as.Date(Data1$Date, format = "%d/%m/%Y")
> str(Data1)
`data.frame':   5 obs. of  2 variables:
 $ Nom : Factor w/ 4 levels "a","b","c","d": 4 3 3 2 1
 $ Date:Class 'Date'  num [1:5] 13111 12129 11668 11092 12104
>
> # 1ère chose: ordonner par patient et par date
> Data2 <- Data1[order(Data1$Nom, Data1$Date), ]
>
> # idée de la commande by: on éclate le data.frame en blocs définis par le nom du patient
> # le calcul des écarts entre visites est ensuite effectué par la fct diff
> # dont le résultat doit être transformé en nombre (as.numeric).
>
> Liste <- by(Data2, list(Nom = Data2$Nom),
+             FUN = function(x){
+               if(nrow(x) == 1)
+                 NULL
+               else{
+                 ecart <- as.numeric(diff(x$Date))
+                 data.frame(Nom = rep(unique(x$Nom), length(ecart)),
+                            Ecart = ecart)
+                 }
+               })
>
> Liste
Nom: a
NULL
---------------------------------------------------------------------------------------------------------------------
Nom: b
NULL
---------------------------------------------------------------------------------------------------------------------
Nom: c
  Nom Ecart
1   c   461
---------------------------------------------------------------------------------------------------------------------
Nom: d
NULL
>
> Data3 <- do.call("rbind", Liste)
> rownames(Data3) <- seq(nrow(Data3))
> Data3
  Nom Ecart
1   c   461

LA haumont
Messages : 41
Enregistré le : 16 Mai 2006, 09:33

Messagepar LA haumont » 24 Mai 2006, 12:32

la truk qui déconne c'est que mes dates ne sont pas en format date donc ca me fait des NA partout! vous savez comment on peut faire le nouveau format?
idem pour certaines variables qui sont en caractères et que je souhaiterais en numérique!
merci beaucoup

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 24 Mai 2006, 12:58

Bonjour,

Beaucoup de questions que vous posez ont leur réponse dans les documents de base comme "An introduction to R" livré avec le logiciel, ou les documents en français disponibles sur le CRAN (le document d'Emmanuel Paradis est très bien fait). Avant de s'adresser à ce forum, il est indispensable que vous lisiez et travaillez ces documents.

Pour les questions que vous posez aujourd'hui, voir le code que je vous ai envoyé et en complément:

(1) l'aide de la fonction as.Date, en particulier son argument format.

(2) l'aide de as.numeric.

Cordialement,

Renaud

Victor Cazalis
Messages : 68
Enregistré le : 24 Aoû 2014, 06:19

Messagepar Victor Cazalis » 13 Déc 2014, 15:17

Bonjour,

J'ai exactement le même problème et je me suis donc servi de cet exemple. Mais un message d'erreur s'affiche :

Code : Tout sélectionner

> Liste <- by(Data2, list(Nom = Data2$Nom), FUN = function(x){if(nrow(x) == 1) NULL else{ecart <- as.numeric(diff(x$Date)) data.frame(Nom = rep(unique(x$Nom), length(ecart)),+Ecart = ecart)}})
Erreur : symbole inattendu(e) in "Liste <- by(Data2, list(Nom = Data2$Nom), FUN = function(x){if(nrow(x) == 1) NULL else{ecart <- as.numeric(diff(x$Date)) data.frame"


J'ai compris la syntaxe de la phrase mais ne comprend pas pourquoi ça ne fonctionne pas. J'ai essayé en recopiant la ligne de code et aussi en l'adaptant à mes données, toujours le même message d'erreur...

Est-ce parce qu'il faut une libraire spéciale ?

Merci, Victor

G.A. [Compte désactivé]

modèle linéaires

Messagepar G.A. [Compte désactivé] » 08 Sep 2015, 08:51

Bonjour,
lorsqu'on fait tourner un modèle linéaire sous R
modele=lm(Y~X1+X2)
et on fait un summary(modele), on récupére les coefficients.
Lorsqu'on fait un modèle modele2=lm((1/Y)~X1+X2)

Peut-on lire directement les coefficients avec une commande R ou est ce qu'on est obligé de faire la gymnastique manuellement pour trouver les coefficients adaptées.

Merci pour vos réponses

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Calcul de dates

Messagepar Eric Casellas » 08 Sep 2015, 11:26

La partie "Value" de la doc de la fonction lm indique que l'objet retourné contient un composant "coefficients".
Tu peut donc y accéder directement via :
[code]modele$coefficients[/code]

Oriane Moyne
Messages : 17
Enregistré le : 20 Oct 2015, 15:50

Re: Calcul de dates

Messagepar Oriane Moyne » 04 Avr 2016, 14:44

Bonjour,

J'ai EXACTEMENT le même problème que LA haumont, à l'exception près que je voudrais obtenir en sortie un data.frame avec un intervalle pour chaque visite du patient, y compris la première (donc ecart=0 pour la première visite).

J'ai donc utilisé la même base de code :

[code]Intervalles <- by(data, list(Nom = data$Patient),
FUN = function(x){
if(nrow(x) == 1)
NULL
else{
ecart <- as.numeric(diff(x$date))
data.frame(Nom = rep(unique(x$Patient), length(ecart)),
Ecart = ecart)
}
})

data_int <- do.call("rbind", Intervalles)
rownames(data_int) <- seq(nrow(data_int)) [/code]

Puis j'ai essayé de bidouiller les parties
[code] if(nrow(x) == 1)
NULL[/code] et
[code] data.frame(Nom = rep(unique(x$Patient), length(ecart)),
Ecart = ecart)[/code]
... sans succès ! Mon "Intervalles" comporte toujours des NULL, qui sont ensuite éliminées de mon data.frame.

Quelqu'un pourrait m'aider ?

Merci d'avance,


Retourner vers « Archives : Manipulation de données avec R »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité

cron