Création d'un nouveau vecteur ou list, basé sur 2 vecteurs ou la valeur de l'un ou de l'autre sera sélectionnée

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

Sylvain Bart
Messages : 6
Enregistré le : 30 Jan 2017, 15:13

Création d'un nouveau vecteur ou list, basé sur 2 vecteurs ou la valeur de l'un ou de l'autre sera sélectionnée

Messagepar Sylvain Bart » 05 Juin 2018, 13:00

Bonjour à tous,

Je ma casse les dents pour la programmation d'une fonction sous R, voici le détail:
J'ai une fonction XX qui génère la sortie de 2 data.frame (très simple, avec une colonne temps qui est la même pour les deux et une colonne de valeur de longueur y)
Ce que souhaiterai faire, c'est créer un nouveau tableau basé sur la sélection de la valeur de longueur y1 ou y2 de sorte que
si y2>y1, y1 est selectionné et si y2<y1, alors y2 est selectionné

avec des chiffres pour illustrer , ça donne ceci:
# mes 2 sorties
> y1
time lenght
1 0 2
2 1 3
3 2 4
4 3 5
5 4 6
6 5 7

> y2
time 1
1 0 2
2 1 3.5
3 2 4.2
4 3 5.1
5 4 5.9
6 5 6.8

#objectif de créer un nouveau qui donnerai ceci :

yfinal:
time 1
1 0 2
2 1 3
3 2 4
4 3 5
5 4 5.9
6 5 6.8

j'essaye de faire ça avec une boucle, mais je n'y arrive pas:
data = matrix(NA, length(y1[,1]),2) #création d'une matrice vide
data[,1]=y1[,1] #j'ai donc ici ma première colonne de complété qui est le temps

j'essai quelque chose comme ça, mais ça ne fonctionne pas, il faut que je le remplisse au fur et à mesure suivant ma condition if else

for(i in 1: length(data[,2])){
if(y2[,2]>y1[,2]) #ici ça prend toute la colonne je pense, mais comment faire pour ne pas écrire manuellement pour tte les colonnes
{data[,i]=y1[,2]}
else {data[,i]=y2[,2]}
}


Quelqun aurait une idée de comment faire? cela parait simple dans la conception, mais je n'arrive pas à programmer...


Un grand merci par avance à ceux qui répondront,

Sylvain

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Création d'un nouveau vecteur ou list, basé sur 2 vecteurs ou la valeur de l'un ou de l'autre sera sélectionnée

Messagepar Logez Maxime » 05 Juin 2018, 13:29

Bonjour,

Code : Tout sélectionner

yfinal <- y1
# attention dans l'exemple lenght pour y1 au lieu de length
yfinal$lenght <- pmin(yfinal$lenght, y2$length)
Cordialement,
Maxime

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

Re: Création d'un nouveau vecteur ou list, basé sur 2 vecteurs ou la valeur de l'un ou de l'autre sera sélectionnée

Messagepar Eric Casellas » 05 Juin 2018, 13:34

Bonjour,

dans ton exemple de code l'indice i de la boucle for correspond au numéro de ligne (que d'ailleurs tu peut récupérer directement via la fonction nrow plutôt que de passer par le fonction length appliquée sur le vecteur d'une colonne comme dans ton exemple), or tu utilise ensuite i comme un index de colonne (data[,i] renvoi toutes les lignes de la colonne i au lieu de data[i,] qui est toutes les colonnes de la ligne i)

Donc à priori ta boucle for devrait plutôt ressembler à ça :

Code : Tout sélectionner

for(i in 1: nrow(data)){
  if(y2[i,2]>y1[i,2]) {
    data[i,2]=y1[i,2]
  } else {
  data[i,2]=y2[i,2]
  }
}


Et sinon pour éviter la boucle for il existe la fonction ifelse qui permet de gérer ça de façon vectorisé, par exemple :

Code : Tout sélectionner

data[,2] <- ifelse(y2[,2]>y1[,2], y1[,2], y2[,2])


edit : correction remonté par Serge sur ifesle / ifelse dans mon exemple de code

Eric
Eric

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Création d'un nouveau vecteur ou list, basé sur 2 vecteurs ou la valeur de l'un ou de l'autre sera sélectionnée

Messagepar Serge Rapenne » 05 Juin 2018, 14:19

Eric, tu soufres du même problème de dyslexie que moi. j'ai arrêté de compter mes "ifesle" en lieu et à la place de "ifelse" ;-)

Sylvain Bart
Messages : 6
Enregistré le : 30 Jan 2017, 15:13

Re: Création d'un nouveau vecteur ou list, basé sur 2 vecteurs ou la valeur de l'un ou de l'autre sera sélectionnée

Messagepar Sylvain Bart » 05 Juin 2018, 15:17

Merci beaucoup pour vos réponses!


Retourner vers « Questions en cours »

Qui est en ligne

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

cron