Retenir 2 obs de chaque groupe sous R
Bonjour,
Voici un extrait de ma base de données:
Patients |
V1 |
V2 |
V3 |
1 |
1 |
a |
a |
1 |
0 |
b |
b |
1 |
1 |
c |
NA |
1 |
0 |
d |
NA |
2 |
0 |
e |
NA |
2 |
1 |
f |
f |
2 |
1 |
g |
NA |
2 |
0 |
h |
h |
3 |
0 |
i |
NA |
3 |
1 |
j |
NA |
4 |
1 |
k |
NA |
4 |
1 |
l |
NA |
4 |
1 |
m |
NA |
En fait, je veux créer la variable V3 qu contient les valeurs de V2 pour deux patients de chaque groupe des patients (1111,2222,333,44,555555555, ...).
Le premier patient c'est celui qui a V1 égale 1 et le deuxième qui a V1 égale 0 (en respectant l'ordre de sélectionner les 2 patients, celui qui V1=1 puis V1=0)
D'avance merci pour votre aide
1 pièce(s) jointe(s)
Retenir 2 obs de chaque groupe sous R
Bonjour,
Voici une proposition :
• Numérotation des observations pour pouvoir recoller les morceaux
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| > df <- read.csv("D:/temp/test.txt")
> df$N <- as.numeric(row.names(df))
> df
Id V1 V2 N
1 1 1 a 1
2 1 0 b 2
3 1 1 c 3
4 1 0 d 4
5 2 0 e 5
6 2 1 f 6
7 2 1 g 7
8 2 0 h 8
9 3 0 i 9
10 3 1 j 10
11 4 1 k 11
12 4 1 l 12
13 4 1 m 13 |
• Numérotation des répétitions par groupe pour vérifier si V1=0 est avant ou après V1=1
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| > df <- df[order(df$Id),]
> df$obsnum <- sequence(rle(as.vector(df$Id))$lengths)
> df
Id V1 V2 N obsnum
1 1 1 a 1 1
2 1 0 b 2 2
3 1 1 c 3 3
4 1 0 d 4 4
5 2 0 e 5 1
6 2 1 f 6 2
7 2 1 g 7 3
8 2 0 h 8 4
9 3 0 i 9 1
10 3 1 j 10 2
11 4 1 k 11 1
12 4 1 l 12 2
13 4 1 m 13 3 |
• Sélection des observations avec V1=1
Code:
1 2 3 4 5 6 7 8 9 10 11
| > df1 <- df[which(df$V1==1),]
> df1
Id V1 V2 N obsnum
1 1 1 a 1 1
3 1 1 c 3 3
6 2 1 f 6 2
7 2 1 g 7 3
10 3 1 j 10 2
11 4 1 k 11 1
12 4 1 l 12 2
13 4 1 m 13 3 |
• Sélection des observations avec V1=0
Code:
1 2 3 4 5 6 7 8
| > df0 <- df[which(df$V1==0),]
> df0
Id V1 V2 N obsnum
2 1 0 b 2 2
4 1 0 d 4 4
5 2 0 e 5 1
8 2 0 h 8 4
9 3 0 i 9 1 |
• Sélection des premières observations de chaque sujet dans df1 (on aurait pu aussi numéroter les répétitions pour sélectionner la première)
Code:
1 2 3 4 5 6 7 8 9
| > myBys <- data.frame(df1$Id)
> selec <- by(df1, myBys, head, n=1)
> df1 <- do.call(rbind, selec)
> df1
Id V1 V2 N obsnum
1 1 1 a 1 1
2 2 1 f 6 2
3 3 1 j 10 2
4 4 1 k 11 1 |
• Ajout du numéro de répétition de df1 dans df0
Code:
1 2 3 4 5 6 7 8
| > df0 <- merge(df1[,c("Id","obsnum")],df0,by="Id")
> df0
Id obsnum.x V1 V2 N obsnum.y
1 1 1 0 b 2 2
2 1 1 0 d 4 4
3 2 2 0 e 5 1
4 2 2 0 h 8 4
5 3 2 0 i 9 1 |
• Sélection des observations de df0 avec numéro de répétition > df1
Code:
1 2 3 4 5 6
| > df0 <- df0[which(df0$obsnum.y > df0$obsnum.x),c("N","Id","V1","V2")]
> df0
N Id V1 V2
1 2 1 0 b
2 4 1 0 d
4 8 2 0 h |
• Sélection des premières observations de chaque sujet dans df0
Code:
1 2 3 4 5 6 7 8
| > myBys <- data.frame(df0$Id)
> selec <- by(df0, myBys, head, n=1)
> df0 <- do.call(rbind, selec)
> df0$selec <- 1
> df0
N Id V1 V2 selec
1 2 1 0 b 1
2 8 2 0 h 1 |
• Sélection des observations de df1 s'il y a une observation sélectionnée dans df0
Code:
1 2 3 4 5 6
| > df1 <- df1[which(df1$Id %in% df0$Id),-5]
> df1$selec <- 1
> df1
Id V1 V2 N selec
1 1 1 a 1 1
2 2 1 f 6 1 |
• Ajout de la variable selec dans df
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| > selec <- rbind(df1,df0)
> df <- merge(df,selec[,c("N","selec")],by="N",all=TRUE)
> df
N Id V1 V2 obsnum selec
1 1 1 1 a 1 1
2 2 1 0 b 2 1
3 3 1 1 c 3 NA
4 4 1 0 d 4 NA
5 5 2 0 e 1 NA
6 6 2 1 f 2 1
7 7 2 1 g 3 NA
8 8 2 0 h 4 1
9 9 3 0 i 1 NA
10 10 3 1 j 2 NA
11 11 4 1 k 1 NA
12 12 4 1 l 2 NA
13 13 4 1 m 3 NA |
• Calcul de la variable V3
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| > df$V3 <- ifelse(df$selec==1,as.character(df$V2),NA)
> df
N Id V1 V2 obsnum selec V3
1 1 1 1 a 1 1 a
2 2 1 0 b 2 1 b
3 3 1 1 c 3 NA <NA>
4 4 1 0 d 4 NA <NA>
5 5 2 0 e 1 NA <NA>
6 6 2 1 f 2 1 f
7 7 2 1 g 3 NA <NA>
8 8 2 0 h 4 1 h
9 9 3 0 i 1 NA <NA>
10 10 3 1 j 2 NA <NA>
11 11 4 1 k 1 NA <NA>
12 12 4 1 l 2 NA <NA>
13 13 4 1 m 3 NA <NA> |
Cordialement,
Retenir 2 obs de chaque groupe sous R
Bonjour,
Merci c'est vraiment super gentil. Votre proposition va m'aider à avancer sur une grande partie de mes analyses.
Bien cordialement