Comment créer un vecteur R vide pour ajouter de nouveaux éléments

92

Je souhaite utiliser R en Python, comme fourni par le module Rpy2. Je remarque que R a très pratique[] opérations par lesquelles vous pouvez extraire les colonnes ou les lignes spécifiques. Comment pourrais-je réaliser une telle fonction par des scripts Python?

Mon idée est de créer un vecteur R et d'ajouter ces éléments voulus dans ce vecteur afin que le vecteur final soit le même que celui de R. J'ai créé un seq(), mais il semble qu'il a un chiffre initial 1, donc le résultat final serait toujours commencez par le chiffre 1, ce qui n'est pas ce que je veux. Alors, y a-t-il une meilleure façon de faire cela?

Ligwin
la source

Réponses:

95
vec <- vector()

Voir aussi l'aide vectorielle

?vector
Brani
la source
56

Je pré-alloue un vecteur avec

> (a <- rep(NA, 10))
 [1] NA NA NA NA NA NA NA NA NA NA

Vous pouvez ensuite utiliser [] pour y insérer des valeurs.

Roman Luštrik
la source
C'est la meilleure réponse si la longueur du vecteur est connue dès le départ, car elle sera la plus efficace en mémoire
stevec
25

Vous pouvez créer un vecteur vide comme ça

vec <- numeric(0)

Et puis ajoutez des éléments en utilisant c ()

vec <- c(vec, 1:5)

Cependant, comme le dit romunov, il est préférable de pré-allouer un vecteur puis de le remplir (car cela évite de réallouer une nouvelle copie de votre vecteur à chaque fois que vous ajoutez des éléments)

Aaron Statham
la source
J'aime votre solution avec numeric (), mais mon expérience m'a conduit à utiliser NA au lieu de 0 (si vous utilisez numeric (2), vous obtiendrez 0 0). Mais c'est ma préférence personnelle.
Roman Luštrik
Merci beaucoup!! Mais est-il possible de libérer le précédent après l'ajout d'un nouvel élément? devrais-je simplement utiliser rm ()?
ligwin
Il y a un autre problème que typeof (numeric (0)) donne "double" alors que les éléments voulus donnent "integer", une fois ajouté, une erreur a été soulevée en disant "Le type de la nouvelle valeur ne peut pas être différent", comment convertir?
ligwin
lorsque vous travaillez en python, le "as" est un mot-clé, en plus, python n'a pas de tels types de données, donc je pense que "as.integer" ne fonctionnera pas?
ligwin
romunov - numérique (0) signifie créer un vecteur numérique avec une longueur de 0 (c'est-à-dire sans élément) pas un vecteur de longueur 1 avec cet élément étant 0
Aaron Statham
6

Pour créer un vecteur vide, utilisez:

vec <- c();

Veuillez noter que je ne fais aucune hypothèse sur le type de vecteur dont vous avez besoin, par exemple numérique.

Une fois le vecteur créé, vous pouvez y ajouter des éléments comme suit:

Par exemple, pour ajouter la valeur numérique 1:

vec <- c(vec, 1);

ou, pour ajouter une valeur de chaîne "a"

vec <- c(vec, "a");
Eldaw
la source
4
Avez-vous réellement essayé cela? vec <- c()définit vec sur NULL. Si vous voulez un vecteur vide que vous utiliseriez vec <- character(), vec <- numeric()etc.
Matthew Wise
5

J'ai aussi vu

x <- {}

Vous pouvez maintenant concaténer ou lier un vecteur de n'importe quelle dimension à x

rbind(x, 1:10)
cbind(x, 1:10)
c(x, 10)
JoFrhwld
la source
2
C'est exactement la même chose x <- NULLet ne crée rien d'autre qu'une référence à nulle part.
Joris Meys
3

Comme l'a souligné Brani, vector () est une solution, eg

newVector <- vector(mode = "numeric", length = 50)

renverra un vecteur nommé "newVector" avec 50 "0" comme valeurs initiales. Il est également assez courant d'ajouter simplement le nouveau scalaire à un vecteur existant pour arriver à un vecteur étendu, par exemple

aVector <- c(aVector, newScalar)

Sam
la source
2

Dans rpy2, la manière d'obtenir le même opérateur que "[" avec R est d'utiliser ".rx". Voir la documentation sur extraction avec rpy2

Pour créer des vecteurs, si vous connaissez votre chemin avec Python, il ne devrait y avoir aucun problème. Voir la documentation sur la création de vecteurs

lgautier
la source
J'avais l'habitude de créer une fonction en python à cet effet, ce qui est très compliqué et je ne sais pas dans quelle mesure cela pourrait s'appliquer. Maintenant, je pense qu'avec ces opérateurs, la vie pourrait être beaucoup plus facile :)
ligwin