Création sous dataframe

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Elisabeth LYONNAIS
Messages : 6
Enregistré le : 10 Déc 2018, 16:12

Création sous dataframe

Messagepar Elisabeth LYONNAIS » 11 Déc 2018, 07:40

Bonjour!

Je suis nouvelle dans l'utilisation de R: je dois faire une analyse sur un fichier de données issu d'une étude cas témoins appariés (1:2).
Chaque triplet a un identifiant commun.
Les cas sont atteints d'un type de maladie (codée 1,2 ou 3) et les témoins ont la valeur "NA" attribuée par défaut pour cette variable

Je dois travailler uniquement avec les cas atteints de la maladie 2, et leurs témoins appariés. je voudrais donc créer un sous dataframe avec uniquement ces sujets.

Quand j'utilise la fonction subset, je me retrouve uniquement avec les cas, impossible de trouver comment avoir les témoins qui leurs sont appariés.

Auriez vous une piste SVP?

Par avance, merci

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Création sous dataframe

Messagepar Pierre-Yves Berrard » 11 Déc 2018, 08:48

Bonjour,

Difficile d'être plus précis sans savoir comment vos données se présentent.

Si, comme je le comprends, un malade et son témoin apparié ont le même identifiant :

Code : Tout sélectionner

malades_2 <- subset(donnees, maladie == "2", select = identifiant)
sous_data_frame <- subset(donnees, identifiant %in% malades_2)
PY

Elisabeth LYONNAIS
Messages : 6
Enregistré le : 10 Déc 2018, 16:12

Re: Création sous dataframe

Messagepar Elisabeth LYONNAIS » 11 Déc 2018, 21:56

Bonsoir, merci beaucoup pour votre réponse
Malheureusement je ne peux exposer les données pour des raisons de confidentialité.
J'ai tenté d'appliquer ce que vous me proposez:
Pour la 1e formule, pas de soucis, j'obtiens un dataframe avec tous les identifiants des malades "2"
Malheureusement, après avoir appliqué la 2e formule, j'obtiens un data frame avec 0 observations...

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Création sous dataframe

Messagepar Pierre-Yves Berrard » 11 Déc 2018, 22:06

Elisabeth LYONNAIS a écrit :Pour la 1e formule, pas de soucis, j'obtiens un dataframe avec tous les identifiants des malades "2"

Erreur de ma part, il faut ajouter drop = TRUE pour simplifier un data.frame d'une colonne en vecteur.

Code : Tout sélectionner

malades_2 <- subset(donnees, maladie == "2", select = identifiant, drop = TRUE)
PY

Elisabeth LYONNAIS
Messages : 6
Enregistré le : 10 Déc 2018, 16:12

Re: Création sous dataframe

Messagepar Elisabeth LYONNAIS » 12 Déc 2018, 10:39

Merci infiniment!

Elisabeth LYONNAIS
Messages : 6
Enregistré le : 10 Déc 2018, 16:12

Re: Création sous dataframe

Messagepar Elisabeth LYONNAIS » 20 Déc 2018, 08:39

Re bonjour,

Me voici à nouveau en difficulté, car je souhaiterai à présent créer un nouveau data frame avec chaque triplet sur une seule et même ligne (cas + ses 2 témoins). Je sais le faire avec des doublets, mais je ne parviens pas à le faire avec des triplets...
Mon but est de pouvoir faire des test de mcnemar, donc si vous avez une solution à proposer (que ce soit en créant un nouveau data frame ou bien par un autre chemin)
Merci par avance!

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Création sous dataframe

Messagepar Pierre-Yves Berrard » 20 Déc 2018, 10:38

Elisabeth LYONNAIS a écrit :Je sais le faire avec des doublets

Comment avez-vous procédé ?
PY

Elisabeth LYONNAIS
Messages : 6
Enregistré le : 10 Déc 2018, 16:12

Re: Création sous dataframe

Messagepar Elisabeth LYONNAIS » 20 Déc 2018, 10:57

Imaginons que je n'ai que des doublets, dans un fichier nommé c3
Pour la variable "CAS" Les malades ont la valeur 1 et les témoins la valeur 0

Malades<-subset(c3,c3$CAS==1)
Témoins<-subset(c3,c3$CAS==0)
c4<-cbind(Malades[,-c(1,2)],Témoins[,-c(1,2)])

Sauf que si je fais pareil avec des triplets, ça me met le "bazar" et les témoins ne correspondent plus aux cas

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Création sous dataframe

Messagepar Pierre-Yves Berrard » 20 Déc 2018, 11:04

Y a-t-il une variable qui permet d'identifier le témoin 1 et le témoin 2 ?
Ou ont-ils le code Cas = 0 (et donc peu importe qui est le 1 et qui est le 2) ?
PY

Elisabeth LYONNAIS
Messages : 6
Enregistré le : 10 Déc 2018, 16:12

Re: Création sous dataframe

Messagepar Elisabeth LYONNAIS » 20 Déc 2018, 11:31

ils ont tous les 2 le code cas=0
en fait pour chaque triplet, la variable "INDENT" est identique (ex 1002,1003,1004) et la variable "ID" change
ex
ID IDENT CAS
1012 1012 1
1022 1012 0
1032 1012 0
1013 1013 1
1023 1013 0
1033 1013 0

etc

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Création sous dataframe

Messagepar Pierre-Yves Berrard » 20 Déc 2018, 12:43

Remarque préalable : utiliser cbind pour la fusion est assez risqué car présuppose que les identifiants apparaissent dans le même ordre. De plus, le résultat comportera plusieurs colonnes avec le même nom. Utiliser merge avec l'argument by = "IDENT" est plus sûr.

Il faut scinder le data.frame des témoins en ne gardant qu'une ligne sur 2 (sous réserve que les témoins d'un même cas sont sur deux lignes consécutives) :

Code : Tout sélectionner

Temoins1 <- Temoins[c(TRUE, FALSE), ]
Temoins2 <- Temoins[c(FALSE, TRUE), ]

Méthode alternative si on peut utiliser le 3e caractère de la variable ID pour déterminer qui est le témoin 1 et le témoin 2 :

Code : Tout sélectionner

Temoins1 <- subset(Temoins, substr(ID, 3, 3) == "2")
Temoins2 <- subset(Temoins, substr(ID, 3, 3) == "3")

Ne reste plus qu'à "merger" les 3 data.frame :

Code : Tout sélectionner

Temoins12 <- merge(Temoins1, Temoins2, by = "IDENT", suffixes = c("_T1", "_T2"))
c4 <- merge(Malades, Temoins12 , by = "IDENT")

edit : éviter de préférence les caractères accentués dans les noms d'objets R.
PY


Retourner vers « Questions en cours »

Qui est en ligne

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

cron