2010-08-05 23 views
77

Quiero usar R en Python, como lo proporciona el módulo Rpy2. Observé que R tiene operaciones [] muy prácticas mediante las cuales puede extraer las columnas o líneas específicas. ¿Cómo podría lograr esa función con los scripts de Python?Cómo crear un vector R vacío para agregar nuevos elementos

Mi idea es crear un vector R y agregar los elementos deseados en este vector para que el vector final sea el mismo que en R. Creé un seq(), pero parece que tiene un dígito inicial 1, por lo que el resultado final siempre comenzaría con el dígito 1, que no es lo que quiero. Entonces, ¿hay una mejor manera de hacer esto?

Respuesta

43

que asignar previamente un vector con

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

A continuación, puede usar [] para insertar valores en ella.

+7

No necesita 'c()'. 'a <-rep (NA, 10)' funciona. Y uno podría forzar la clase de vector usando un tipo específico de 'NA', por ejemplo:' rep (NA_integer_, 10) '(ver' help ("NA") '). – Marek

+0

Por supuesto, podría abandonar c(), un momento de alto rango de mi parte. Buena información Marek, gracias. –

21

Puede crear un vector vacío como tal

vec <- numeric(0) 

Y a continuación, añadir elementos utilizando c()

vec <- c(vec, 1:5) 

Sin embargo, como dice romunov, que es mucho mejor para asignar previamente un vector y luego poblarlo (ya que esto evita la reasignación de una nueva copia de su vector cada vez que agregue elementos)

+0

Me gusta su solución con numérico(), pero mi experiencia me ha llevado a usar NA en lugar de 0 (si usa numérico (2), obtendrá 0 0). Pero esa es mi preferencia personal. –

+0

¡Muchas gracias! ¿Pero es posible liberar el anterior después de agregar un nuevo elemento? ¿debería simplemente usar rm()? – ligwin

+0

Hay otro problema que typeof (numeric (0)) da "double" mientras que los elementos buscados dan "integer", cuando se agrega, se genera un error que dice "El tipo para el nuevo valor no puede ser diferente", ¿cómo convertir? – ligwin

87
vec <- vector() 

See también vector ayudo

?vector 
+3

Esta es la mejor estrategia para usar. – Kevin

+3

¡Respuesta perfecta, e incluso puede reducir el riesgo de error por tener un indicio sobrante o NA flotando alrededor! En cualquier caso, esto es exactamente lo que necesitaba. – Mnescat

+2

Me acabo de dar cuenta de que ya he estado aquí hace un tiempo y he votado a favor. Bueno, gracias de nuevo ;-) – greg121

4

También he visto

x <- {} 

Ahora se puede concatenar o unir un vector de cualquier dimensión a x

rbind(x, 1:10) 
cbind(x, 1:10) 
c(x, 10) 
+1

Esto es exactamente lo mismo que 'x <- NULL', y no crea nada más que una referencia a la nada. –

1

En rpy2, la forma de obtener el mismo operador que "[" con R es usar ".rx". Consulte la documentación sobre extracting with rpy2

Para crear vectores, si conoce bien el sistema con Python, no debería haber ningún problema. Consulte la documentación sobre creating vectors

+0

Solía ​​crear una función en python para este propósito, que es muy complicada y no estoy seguro de cuán ampliamente podría aplicarse. Ahora creo que con estos operadores, la vida podría ser mucho más fácil :) – ligwin

2

Como lo señala Brani, el vector() es una solución, p.

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

devolverá un vector llamado "newVector" con 50 "0" 's como valores iniciales. También es bastante común simplemente agregar el nuevo escalar a un vector existente para llegar a un vector expandido, p.

aVector <- c(aVector, newScalar)

3

Para crear un uso vector vacío:

vec <- c(); 

Tenga en cuenta, no estoy haciendo ninguna hipótesis sobre el tipo de vector que necesite, por ejemplo numérico.

Una vez que el vector se ha creado puede añadir elementos a él de la siguiente manera:

Por ejemplo, para agregar el valor numérico 1:

vec <- c(vec, 1); 

o, para agregar un valor de cadena "a"

vec <- c(vec, "a"); 
+2

¿Has probado esto? 'vec <- c()' establece vec a 'NULL'. Si quiere un vector vacío, debe usar 'vec <- character()', 'vec <- numeric()', etc. –

Cuestiones relacionadas