1
votes

Comment exécuter une boucle où je change i et k en même temps dans R?

J'ai deux objets:

1982; "1982-11-02"
1984; "1984-11-06"
1986; "1986-11-04"

Et

for (i in ElectionDay){
for (k in ElectionYear){
print(i); print(k)

}}

Je veux lancer une boucle for qui change i et k en même temps évaluer. C'est ce que j'ai jusqu'à présent et je sais que c'est faux.

ElectionYear <- seq(from=1982, to=1986, by = 2)

Je veux que la sortie ressemble à ceci:

ElectionDay <- c( "1982-11-02",
                  "1984-11-06",
                  "1986-11-04")

Je ne veux pas qu'il revienne là où il exécute tout i pour chaque valeur de k comme il le ferait dans une boucle normale.


3 commentaires

Que voulez-vous dire change i et k au même rythme ? Peut-être recherchez-vous ElectionYear [match (gsub ('-. *', '', ElectionDay), ElectionYear)] ?


Dans votre code k n'est pas défini. Vous pouvez extraire l'année de la date.


Vous avez raison. Je l'ai corrigé.


3 Réponses :


0
votes

Il existe plusieurs façons de procéder. Mais d'abord, vous devez indiquer de ... à que vous souhaitez interagir, donc ce serait une partie 1: length (ElectionDay) .

Vous pouvez utiliser code> lubridate pour coller l'année de votre objet ElectionDay puis l'utiliser dans la boucle.

for (i in 1:length(ElectionDay)){
  cat(paste0(year(ElectionDay[i])), ";", paste0('"', ElectionDay[i], '"'), "\n")
}


#1982 ; "1982-11-02" 
#1984 ; "1982-11-02" 
#1986 ; "1982-11-02" 

qui renvoie: p>

#[1] "1982 ; 1982-11-02"
#[1] "1984 ; 1984-11-06"
#[1] "1986 ; 1986-11-04"

Si vous voulez retirer les années et le point-virgule, vous pouvez utiliser cat à la place, comme @ jay.sf l'a dit:

library(lubridate)

ElectionDay <- c( "1982-11-02",
                  "1984-11-06",
                  "1986-11-04")

for (i in 1:length(ElectionDay)){
  print(paste(year(ElectionDay[i]), ";", ElectionDay[i]))
}


0 commentaires

1
votes

Vous pouvez utiliser cat et paste0 dans la boucle.

1982; "1982-11-02" 
1984; "1984-11-06" 
1986; "1986-11-04" 

Le \ n donne le nouvelle ligne.

Comme @markus l'a souligné, nous pouvons éviter la boucle for en faisant:

cat(paste(ElectionYear, paste0('"', ElectionDay, '"'), sep = "; "), sep = "\n")

Résultat

for(i in 1:3) {
  cat(paste0(ElectionYear[i], ";"), paste0('"', ElectionDay[i], '"'), "\n")
}


3 commentaires

Une option pour éviter la boucle que vous voudrez peut-être ajouter dans votre réponse est cat (paste (ElectionYear, ElectionDay, sep = ";"), sep = "\ n")


Le sep = "\ n" est chouette, merci !! Les citations manquaient cependant.


Impressionnant! Merci à tous pour vos réponses utiles!



0
votes

Je ferais cela avec mapply:

a <- mapply(function(i,k){
  print(i)
  print(k)
}, ElectionDay, ElectionYear)

mapply prend des vecteurs et appelle une fonction avec chaque élément des vecteurs comme arguments. (L'affectation à a est simplement de supprimer la sortie de mapply)


0 commentaires