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?

Réponses:


95
vec <- vector()

Voir aussi l'aide vectorielle

?vector

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.


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)


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

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)

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)


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.