J'essaie d'apprendre R et je n'arrive pas à comprendre comment ajouter à une liste.
Si c'était Python, je le ferais. . .
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
Comment faites-vous cela en R?
#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector
vector = values
; ou vous pouvez faire vector = vecteur + valeurs. Mais je ne comprends peut-être pas votre cas d'utilisationRéponses:
L'ajout à un objet dans une boucle for fait que l'objet entier est copié à chaque itération, ce qui amène beaucoup de gens à dire "R est lent" ou "les boucles R doivent être évitées".
Comme BrodieG l'a mentionné dans les commentaires: il est préférable de pré-allouer un vecteur de la longueur souhaitée, puis de définir les valeurs des éléments dans la boucle.
Voici plusieurs façons d'ajouter des valeurs à un vecteur. Tous sont découragés.
Ajout à un vecteur dans une boucle
help("append")
aurait répondu à votre question et économisé le temps qu'il vous a fallu pour écrire cette question (mais vous aurait fait développer de mauvaises habitudes). ;-)Notez que ce
vector <- c()
n'est pas un vecteur vide; c'estNULL
. Si vous voulez un vecteur de caractères vide, utilisezvector <- character()
.Pré-allouer le vecteur avant de boucler
Si vous devez absolument utiliser une boucle for, vous devez pré-allouer le vecteur entier avant la boucle. Ce sera beaucoup plus rapide que d'ajouter des vecteurs plus grands.
la source
vector <- character(length(values)); for(...
)?FWIW: analogue à append () de python:
la source
b <- 1; b <- append(b, 2)
. Mais comme vous le dites, c () est une manière plus R de faire les choses.Vous avez quelques options:
c(vector, values)
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
Le premier est l'approche standard. Le second vous donne la possibilité d'ajouter un endroit autre que la fin. Le dernier est un peu déformé mais a l'avantage de le modifier
vector
(bien que vraiment, vous puissiez le faire aussi facilementvector <- c(vector, values)
.Notez que dans R, vous n'avez pas besoin de parcourir les vecteurs. Vous pouvez simplement les opérer dans leur intégralité.
En outre, ce sont des choses assez basiques, vous devriez donc consulter certaines des références .
Quelques autres options basées sur les commentaires OP:
la source
c
pour ajouter des données au lieu de vecteurs?Par souci d'exhaustivité, ajouter des valeurs à un vecteur dans une boucle for n'est pas vraiment la philosophie de R. R fonctionne mieux en opérant sur des vecteurs dans leur ensemble, comme l'a souligné @BrodieG. Vérifiez si votre code ne peut pas être réécrit comme suit:
La sortie sera un vecteur de valeurs de retour. Vous pouvez également utiliser
lapply
si les valeurs sont une liste au lieu d'un vecteur.la source
Parfois, nous devons utiliser des boucles, par exemple, lorsque nous ne savons pas combien d'itérations nous avons besoin pour obtenir le résultat. Prenons l'exemple des boucles while. Voici les méthodes que vous devez absolument éviter:
Celles-ci sont très inefficaces car R copie le vecteur à chaque ajout.
Le moyen le plus efficace d'ajouter est d'utiliser l'index. Notez que cette fois, je le laisse itérer 1e7 fois, mais c'est quand même beaucoup plus rapide que
c
.C'est acceptable. Et nous pouvons le rendre un peu plus rapide en remplaçant
[
par[[
.Peut-être avez-vous déjà remarqué que cela
length
peut prendre du temps. Si nous remplaçonslength
par un compteur:Comme d'autres utilisateurs l'ont mentionné, la pré-allocation du vecteur est très utile. Mais c'est un compromis entre la vitesse et l'utilisation de la mémoire si vous ne savez pas combien de boucles vous avez besoin pour obtenir le résultat.
Une méthode intermédiaire consiste à ajouter progressivement des blocs de résultats.
la source
Dans R, vous pouvez essayer de cette façon:
la source
la source
Ce que vous utilisez dans le code python s'appelle une liste en python, et c'est totalement différent des vecteurs R, si j'obtiens ce que vous voulez faire:
la source