Boucle for pour découper un tableau

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

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Boucle for pour découper un tableau

Messagepar Jennifer Nacef » 07 Mai 2015, 07:44

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 : Tout sélectionner

> 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 : Tout sélectionner

> 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 : Tout sélectionner

> 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 : Tout sélectionner

> 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 :)

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Messagepar Jennifer Nacef » 14 Mai 2015, 16:56

Re bonjour !

Pas d'idée de réponse ? Peut-être que ma question n'était pas claire ?

Je souhaiterait créer une boucle avec un i allant de 1 à la valeur de mon dernier essai et pour cela, je pense qu'il faut créer des sous-tableaux mais je ne sais pas quelle est la synthaxe à utiliser :

Code : Tout sélectionner

> file[,4] <- file[,1]
> indextps <- file$V4[which(file$EVENT==1001)]

> for (i in (1 : length(indextps))) {
    tab <- seq ()
    tab[[i]] <- data.frame(subset (file,file$V3==i))
    tab[[i]]$V4 <- tab[[i]]$TIME - subset(tab[[i]]$TIME,tab[[i]]$EVENT==1001)  }

> tab <- rbind (tab[[i]]
> file <- tab

Je ne sait pas si le double croché est approprié ici mais ma boucle for ne fonctionnant pas je n'arrive pas à m'en sortir ...

Code : Tout sélectionner

Error in tab[[i]] <- data.frame(subset(file, file$V3 == i)) :
  more elements supplied than there are to replace


Merci d'avance pour votre aide et bon week-end pour ceux qui ont la chance de faire le pont ;)

Gabriel Terraz
Messages : 593
Enregistré le : 26 Sep 2011, 15:11

Messagepar Gabriel Terraz » 14 Mai 2015, 17:16

Salut,
Tu pourrais peut-être simplifier ton message, cela donnerait plus envie d'aider. Donne un exemple minimal de tes données et ce que tu veux obtenir, sans en mettre 500 lignes...
C'est plus agréable quand on peut tout visualiser d'un coup.
Utilises dput(tondataframe) et copie-colle pour mettre un extrait de tes données.

Cordialement,


Gabriel

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Messagepar Jennifer Nacef » 15 Mai 2015, 13:10

Bonjour,

Je suis désolée si mes 122 lignes (et non 500, n’exagérons rien, c'est moi la marseillaise ici ;) ) en ont effrayé plus d'un, je ne pensais pas mal faire. Je trouve ça plus explicite si le tableau est sous cette forme (et plus pratique que de faire des aller-retour entre R et mon post pour comprendre le problème), mais vu l'absence de réponse tu as sans doute raison. Du coup, j'ai modifié mon message, et j'espère que cette fois quelqu'un pourra me répondre :)

Bonne journée

Gabriel Terraz
Messages : 593
Enregistré le : 26 Sep 2011, 15:11

Messagepar Gabriel Terraz » 15 Mai 2015, 13:32

En fait je te conseillais aussi de simplifier au maximum, on a pas besoin de tout le tableau. Lis ces conseils :

viewtopic.php?t=3302

Et un exemple de message :

viewtopic.php?t=7356

Un aperçu d'un petit tableau, un code pour charger les données, et un aperçu de ce qui est voulu : simple et efficace !

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Messagepar Jennifer Nacef » 15 Mai 2015, 15:26

Le problème c'est que mes tableaux ne sont pas petits ... Je peux les tronquer autant que je veux, ils feront au minimum 15 lignes pour un essai, et encore les codes 1142 sont répétés un nombre aléatoire de fois. De plus, le but était de présenter plusieurs essais pour illustrer mon problème de la colonne $V4.

Ensuite mes codes prennent de la place (d'ailleurs ils ne dépassent pas la taille d'écran comme conseille le post que tu m'as montré, et pourtant j'ai pas un grand écran ...) mais parce que j'expose ce que je souhaite faire et plutôt que de balancer mon problème. Je montre les pistes qui me semblent pertinentes pour avoir une réponse plus rapidement.

Sur ce, Gabriel, si tu n'es là que pour juger ma syntaxe, je pense que je peux me passer de ces commentaires

Arnaud Becheler
Messages : 64
Enregistré le : 20 Mar 2013, 13:47

Messagepar Arnaud Becheler » 15 Mai 2015, 17:36

Bonjour Jennifer,

Sur ce, Gabriel, si tu n'es là que pour juger ma syntaxe, je pense que je peux me passer de ces commentaires

Vas-y mollo, les gens ne sont ici que pour aider...
Il a raison de te donner des conseils de syntaxe : j'ai passé cinq minutes à tenter de comprendre ton problème et tes objectifs, je n'ai rien compris, c'est rebutant. Contrairement à toi, les gens de ce forum n'ont pas passé plusieurs heures/jours/mois à travailler sur la structure de ton jeu de données. Si personne ne comprend, c'est que ça manque de concision.
Il n'y a rien d'agressif à dire que le problème est mal présenté, on est tous passés par des demandes d'aide trop longues. Par contre, si je passe 10 minutes de mon temps de travail à t'aider dans la formulation de ton message, à te donner des liens utiles etc je n'apprécierais que très moyennement une réprimande.

Donc à mon tour de te conseiller :

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 ne comprends pas cette phrase. Promis j'ai fait un effort. Schématise, explique l'essence du problème de programmation.

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

Déjà un peu plus clair. Mais comment sont calculés les temps ? Certainement selon la phrase du dessus, mais comme elle est difficilement compréhensible, on ne visualise pas la transformation que tu souhaite effectuer.

Bien cordialement,
Arno
Es lo que hay

jean lobry
Messages : 736
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Boucle for pour découper un tableau

Messagepar jean lobry » 15 Mai 2015, 18:36

Jennifer Nacef a écrit :[...]
Je souhaiterais créer une 4e colonne indiquant les temps pour un essai, et qui commencerait par 0.
[...]

Bonjour,

je ne suis pas certain d'avoir compris : tu veux créer une colonne qui contient plusieurs valeurs ? Ce n'est pas que ce soit impossible, mais ce n'est pas très naturel sous R où il n'y a en général dans les jeux de données qu'une seule valeur dans la case (i,j).

Amicalement,

Jean

jean lobry
Messages : 736
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 15 Mai 2015, 19:33

Bonjour à tous,

je profite du post de Jennifer (dont je salue la volonté de publier ses données sous une forme accessible à tous) pour vous donner une astuce très basique que j'aimerais partager tant elle m'a simplifié la vie quand je l'ai découverte. Ne vous attendez pas à de grandes révélations cependant !

Jennifer veut partager ses données qui sont volumineuses et en donne un extrait reproductible via dput() que je récupère illico presto en analyse exploratoire :

Code : Tout sélectionner

dta <- 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")

boxplot(TIME~V3, data = dta)


Si vous exécutez ce code vous verrez immédiatement le problème des modalités non documentées : pour simplifier son exemple Jennifer n'a donné qu'un extrait des données, mais toutes les modalités initialement présentes sont toujours présentes (merci R d'être conservatif !). Mais qui n'a jamais pesté contre ses modalités vides ? Qui n'a jamais rêvé de s'en débarrasser ? Moi, le premier. Voici donc l'astuce : simplement recoder le facteur en facteur et le tour est joué :

Code : Tout sélectionner

dta$V3 <- factor(dta$V3)
boxplot(TIME~V3, data = dta)

My two cents :-)

Amicalement,

Jean

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Messagepar Jennifer Nacef » 16 Mai 2015, 07:08

Bonjour,

Ce n'est pas que je m'emporte mais voilà une semaine que je suis sur ce problème sans arriver à le résoudre et la seule personne qui me répond me corrige sur ma syntaxe. Ok la première fois je corrige, je ne pensais pas que mon message rebuterait quelqu'un. Mais refaire des commentaires après ça, alors que, en toute sincérité, je ne vois vraiment pas comment réduire plus mon message, je ne vois pas vraiment l'intérêt pour faire avancer mon problème ...
Je ne comprends pas cette phrase. Promis j'ai fait un effort. Schématise, explique l'essence du problème de programmation.

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

[...]

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.

Je n'ai peut-être pas bien expliqué ce point là... Donc la colonne "EVENT" code, vous l'aurez deviné, pour des évènements (réalisés par mes sujets) et TIME représente les temps auxquels ces évènements apparaissent. Et ces évènements sont toujours dans le même ordre (celui présenté juste au-dessus), forment un essai et un essai se répète x fois.

Il se trouve que quand j'enregistre les évènements c'est au cours d'une session de 4h et mon programme me donne donc les temps de t0 à t+4h. Je souhaiterais créer une nouvelle colonne, qui reprenne les temps de la colonne TIME mais qui à chaque nouvel essai (code 1001) reparte de 0. J'aurais ainsi les temps d'apparition de chaque évènement par essai.

tu veux créer une colonne qui contient plusieurs valeurs ?

Je ne veux donc que la nouvelle valeur dans ma colonne $V4 comme je l'ai montré dans l'exemple où j'ai décomposé un de mes tableaux :

Code : Tout sélectionner

> 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")


J'espère avoir été plus claire, je ne m'étais vraiment pas rendu compte que ce que je demandais était flou.

Bonne journée

Arnaud Becheler
Messages : 64
Enregistré le : 20 Mar 2013, 13:47

Messagepar Arnaud Becheler » 16 Mai 2015, 12:02

Bonjour Jennifer,
Il se trouve que quand j'enregistre les évènements c'est au cours d'une session de 4h et mon programme me donne donc les temps de t0 à t+4h. Je souhaiterais créer une nouvelle colonne, qui reprenne les temps de la colonne TIME mais qui à chaque nouvel essai (code 1001) reparte de 0. J'aurais ainsi les temps d'apparition de chaque évènement par essai.

C'est déjà plus clair :) Est-ce qu'on peut se passer des codes d'évènement (1001 etc...) et utiliser plutot l'index d'essai (1/2/3) ? Si oui, quand je lance ce code, je crois obtenir ce que tu cherches. Confirme-tu ? Si c'est le cas, sache qu'il y a certainement une manière plus élégante de faire que mon pauvre code ;)

Code : Tout sélectionner

dta <- 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")

dta$V3 <- factor(dta$V3)

# Initialisation
dta[,4] <- dta[, 1]
current_serie <- 1
i <- 1

# Boucler sur les lignes et les séries d'essais
while(i <= nrow(dta)){
  t0 <- dta[i, 1]
  print(dta[i,3])
  while(i <= nrow(dta) && dta[i,3] == current_serie){
    dta[i, 4] <- dta[i,4] - t0
    i <- i +1
  }
  current_serie <- current_serie + 1
}

plot(dta[,4])




Bien cordialement,
Arno

PS : Merci Jean pour l'astuce :D
Es lo que hay

Jennifer Nacef
Messages : 28
Enregistré le : 24 Fév 2015, 08:53

Messagepar Jennifer Nacef » 16 Mai 2015, 13:40

C'est super, il semble que ça fonctionne :) Merci beaucoup
Effectivement, je n'avais pas pensé à utiliser i de cette façon, c'est vraiment astucieux ! Merci encore :D

Bon week-end !

Et je pense qu'on peut considérer ce sujet comme résolu :)

Arnaud Becheler
Messages : 64
Enregistré le : 20 Mar 2013, 13:47

Messagepar Arnaud Becheler » 16 Mai 2015, 14:19

Content de voir que ça résout ton problème :)

Bonne chance dans ton projet,
Arno
Es lo que hay


Retourner vers « Questions en cours »

Qui est en ligne

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