Bonjour,
(oui mon titre est pas très joli mais je n'arrive pas à exprimer de manière synthétique mon problème ...)

Ma question est peut-être plutôt simple mais je suis bloquée et n'arrive pas à avancer.

Je vous explique "brièvement" :
J'ai un tableau comprenant 3 colonnes :
- [,1] : Une suite d'évènements (codés par des chiffres)
- [,2] : Les temps d’apparition de chacun.
- [,3] : Un index du n° d'essai
Voici un extrait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
> dput(file) #je vous le donne sous cette forme pour que ce soit plus agréagle à lire
structure(list(TIME = c(0, 0.003, 0.104, 0.823, 0.954, 1.149, 1.269, 1.444, 1.444, 1.448, 1.512, 1.672, 1.838, 2.038, 2.22, 2.43, 2.728, 3.114, 3.482, 3.636, 3.85, 4.082, 4.34, 4.578, 8.376, 8.572, 8.752, 8.94, 9.158, 16.448, 16.572, 17.854, 25.314, 25.478, 25.876, 29.604, 29.756, 29.94, 30.108, 30.316, 43.072, 53.98, 75.22, 109.6, 134.714, 143.638, 159.494, 167.792, 182.106, 184.194, 194.51, 222.482, 227.478, 232.966, 265.144, 275.328, 277.662, 285.69, 297.844, 311.928, 318.899, 318.899, 318.9, 318.999, 319.615, 323.887, 324.897, 333.933, 343.493, 343.493, 343.495, 343.985, 344.565, 354.175, 358.495, 358.617, 395.027, 451.549, 488.929, 490.655, 509.439, 557.241, 571.009, 594.897, 624.097, 638.557, 646.007, 652.345, 660.951, 660.951, 660.951, 661.05, 666.612, 676.837, 680.91, 693.875, 699.332, 699.332, 699.334, 699.714, 700.11, 714.334, 714.458, 728.176, 739.138, 748.866, 761.726, 791.818, 811.446, 846.526, 866.434, 871.102, 884.994, 898.628, 917.312, 936.716, 943.124, 951.94, 960.138, 969.284, 1013.104, 1016.783), 
EVENT = structure(c(2L, 1L, 10L, 8L, 8L, 8L, 8L, 8L, 5L, 3L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 6L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L, 2L, 1L, 10L, 8L, 8L, 8L, 8L, 8L, 5L, 3L, 9L, 9L, 9L, 6L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L, 2L, 1L, 10L, 8L, 8L, 8L, 8L, 8L, 5L, 3L, 9L, 9L, 6L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L), .Label = c("5", "1001", "1023", "1030", "1121", "1122", "1123", "1141", "1142", "1199"), class = "factor"), 
V3 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"), class = "factor")), .Names = c("TIME", "EVENT", "V3"), row.names = c(NA, 122L), class = "data.frame")
Vous remarquerez que les codes sont toujours dans le même ordre (1001 - x (ici 5 mais peut changer à plusieurs fois) - 1199 - 1141 (répété x fois) - 1121 - 1023 - 1142 (répété x fois) - 1122 - 1123 - 1142 (répété x fois) - 1030). En fait, de 1001 à 1030, j'ai un essai. Et je répète ces essais x fois (j'ai pas tout mis ici, ça serait trop long).

Je souhaiterais créer une 4e colonne indiquant les temps pour un essai, et qui commencerait par 0.

J'ai essayé plusieurs méthodes mais je ne sais visiblement pas m'y prendre ... J'ai d'abord tenté d'utiliser une boucle for mais quelque chose doit clocher ici ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
> file[,4] <- file[,1] #copie de la colonne de temps en 4
> indextps <- file$V4[which(file$EVENT==1001)] #extraction des temps  correspondant a chaque debut d'essai pour obtenir le nombre d'essais totaux
 
> for (i in (1 : length(indextps))) #creation d'une boucle avec un i allant de 1 essai au xième essai
    { file$V4 <- file$TIME[which(file$V3==i)] - subset(file$TIME,file$EVENT==1001)[which(file$V3==i)] } #soustration du temps de début d'essai (1001) au temps de l'essai complet pour chaque valeur de i (et donc pour chaque essai)
 
Error in `$<-.data.frame`(`*tmp*`, "V4", value = c(0, -318.896, -660.847,  :
  le tableau de remplacement a 61 lignes, le tableau remplacé en a 434
Mais ce code ne fonctionne pas... --'
J'ai d'abord pensé que ma formule de soustraction clochait mais si je décortique le tableau :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
> tab1<-data.frame(subset (file,file$V3==1))
> tab2<-data.frame(subset (file,file$V3==2))
> tab3<-data.frame(subset (file,file$V3==3))
> tab4<-data.frame(subset (file,file$V3==4))
> tab5<-data.frame(subset (file,file$V3==5))
> tab6<-data.frame(subset (file,file$V3==6))
> tab7<-data.frame(subset (file,file$V3==7))
#etc ...
#je fais ici le découpage en fonction de l'index $V3 qui représente mes essais
 
> tab2$V4 <- tab2$TIME - subset(tab2$TIME,tab2$EVENT==1001)
> tab3$V4 <- tab3$TIME - subset(tab3$TIME,tab3$EVENT==1001)
> tab4$V4 <- tab4$TIME - subset(tab4$TIME,tab4$EVENT==1001)
> tab5$V4 <- tab5$TIME - subset(tab5$TIME,tab5$EVENT==1001)
> tab6$V4 <- tab6$TIME - subset(tab6$TIME,tab6$EVENT==1001)
> tab7$V4 <- tab7$TIME - subset(tab7$TIME,tab7$EVENT==1001)
#etc ...
#je réalise la soustraction pour que toutes mes valeurs de temps commencent à 0
 
> tab<-rbind (tab1,tab2,tab3,tab4,tab5,tab6,tab7)
#je ré-assemble le tout
 
 
> dput(file) #pareil que précédemment
structure(list(TIME = c(0, 0.003, 0.104, 0.823, 0.954, 1.149, 1.269, 1.444, 1.444, 1.448, 1.512, 1.672, 1.838, 2.038, 2.22, 2.43, 2.728, 3.114, 3.482, 3.636, 3.85, 4.082, 4.34, 4.578, 8.376, 8.572, 8.752, 8.94, 9.158, 16.448, 16.572, 17.854, 25.314, 25.478, 25.876, 29.604, 29.756, 29.94, 30.108, 30.316, 43.072, 53.98, 75.22, 109.6, 134.714, 143.638, 159.494, 167.792, 182.106, 184.194, 194.51, 222.482, 227.478, 232.966, 265.144, 275.328, 277.662, 285.69, 297.844, 311.928, 318.899, 318.899, 318.9, 318.999, 319.615, 323.887, 324.897, 333.933, 343.493, 343.493, 343.495, 343.985, 344.565, 354.175, 358.495, 358.617, 395.027, 451.549, 488.929, 490.655, 509.439, 557.241, 571.009, 594.897, 624.097, 638.557, 646.007, 652.345, 660.951, 660.951, 660.951, 661.05, 666.612, 676.837, 680.91, 693.875, 699.332, 699.332, 699.334, 699.714, 700.11, 714.334, 714.458, 728.176, 739.138, 748.866, 761.726, 791.818, 811.446, 846.526, 866.434, 871.102, 884.994, 898.628, 917.312, 936.716, 943.124, 951.94, 960.138, 969.284, 1013.104, 1016.783), EVENT = structure(c(2L, 1L, 10L, 8L, 8L, 8L, 8L, 8L, 5L, 3L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 6L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L, 2L, 1L, 10L, 8L, 8L, 8L, 8L, 8L, 5L, 3L, 9L, 9L, 9L, 6L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L, 2L, 1L, 10L, 8L, 8L, 8L, 8L, 8L, 5L, 3L, 9L, 9L, 6L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L), .Label = c("5", "1001", "1023", "1030", "1121", "1122", "1123", "1141", "1142", "1199"), class = "factor"), V3 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"), class = "factor"), V4 = c(0, 0.003, 0.104, 0.823, 0.954, 1.149, 1.269, 1.444, 1.444, 1.448, 1.512, 1.672, 1.838, 2.038, 2.22, 2.43, 2.728, 3.114, 3.482, 3.636, 3.85, 4.082, 4.34, 4.578, 8.376, 8.572, 8.752, 8.94, 9.158, 16.448, 16.572, 17.854, 25.314, 25.478, 25.876, 29.604, 29.756, 29.94, 30.108, 30.316, 43.072, 53.98, 75.22, 109.6, 134.714, 143.638, 159.494, 167.792, 182.106, 184.194, 194.51, 222.482, 227.478, 232.966, 265.144, 275.328, 277.662, 285.69, 297.844, 311.928, 318.899, 0, 0.000999999999976353, 0.100000000000023, 0.716000000000008, 4.988, 5.99799999999999, 15.034, 24.594, 24.594, 24.596, 25.086, 25.666, 35.276, 39.596, 39.718, 76.128, 132.65, 170.03, 171.756, 190.54, 238.342, 252.11, 275.998, 305.198, 319.658, 327.108, 333.446, 342.052, 0, 0, .0989999999999327, 5.66099999999994, 15.886, 19.9589999999999, 32.924, 38.381, 38.381, 38.3829999999999, 38.763, 39.159, 53.3829999999999, 53.5069999999999, 67.225, 78.187, 87.915, 100.775, 130.867, 150.495, 185.575, 205.483, 210.151, 224.043, 237.677, 256.361, 275.765, 282.173, 290.989, 299.187, 308.333, 352.153, 355.832)), .Names = c("TIME", "EVENT", "V3", "V4"), row.names = c(NA, 122L), class = "data.frame")
Je vous le donne en mille, ça fonctionne !

Je pense que le problème vient de mon i parce que quand je pose ce code ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
> file$TIME[which(file$EVENT==1001)][[i]]
[1] 5534399
... je devrait obtenir toutes les valeurs de TIME pour lesquelles EVENT==1001, et ce pour i =1, i = 2 ... etc (mon i dans cet exemple valait de 1 à 15) donc 15 nombres. Mais je n'en obtiens qu'un qui se trouve être le EVENT==1001 du $V3==15 (vous me suivez?). Ma question est donc : pourquoi je n'obtiens pas mes 15 TIMEs ?

Si quelqu'un voit quel est mon problème (ou peut m'aider sur cette fonction for que je ne sais pas bien utiliser visiblement) pourrait-il me l'indiquer ?

Merci d'avance