Cómo crear un vector R vacío para agregar nuevos elementos

92

Quiero usar R en Python, como lo proporciona el módulo Rpy2. Noto que R tiene []operaciones muy convenientes mediante las cuales puede extraer las columnas o líneas específicas. ¿Cómo podría lograr tal función mediante scripts de Python?

Mi idea es crear un vector R y agregar esos 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 sería Empiece con el dígito 1, que no es lo que quiero. Entonces, ¿hay una mejor manera de hacer esto?

ligwin
fuente

Respuestas:

95
vec <- vector()

Ver también ayuda de vectores

?vector
Brani
fuente
56

Preasigno un vector con

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

Luego puede usar [] para insertar valores en él.

Roman Luštrik
fuente
Esta es la mejor respuesta si la longitud del vector se conoce desde el principio, ya que será más eficiente en la memoria
stevec
25

Puedes crear un vector vacío como ese

vec <- numeric(0)

Y luego agregue elementos usando c ()

vec <- c(vec, 1:5)

Sin embargo, como dice romunov, es mucho mejor preasignar un vector y luego completarlo (ya que esto evita reasignar una nueva copia de su vector cada vez que agrega elementos)

Aaron Statham
fuente
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.
Roman Luštrik
¡¡Muchas gracias!! Pero, ¿es posible liberar el anterior después de agregar un nuevo elemento? ¿Debería simplemente usar rm ()?
ligwin
Hay otro problema de que typeof (numérico (0)) da "double" mientras que los elementos deseados dan "integer", cuando se agregan, se genera un error que dice "El tipo para el nuevo valor no puede ser diferente", ¿cómo convertir?
ligwin
cuando se trabaja en Python, el "as" es una palabra clave, además, Python no tiene tales tipos de datos, así que creo que "as.integer" no funcionará.
ligwin
romunov - numérico (0) significa crear un vector numérico con una longitud de 0 (es decir, sin elementos) no un vector de longitud 1 con ese elemento siendo 0
Aaron Statham
6

Para crear un vector vacío use:

vec <- c();

Tenga en cuenta que no estoy haciendo ninguna suposición sobre el tipo de vector que necesita, por ejemplo, numérico.

Una vez que se ha creado el vector, puede agregarle elementos 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");
Eldaw
fuente
4
¿De verdad has probado esto? vec <- c()establece vec en NULL. Si desea un vector vacío, usaría vec <- character(), vec <- numeric()etc.
Matthew Wise
5

Yo tambien he visto

x <- {}

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

rbind(x, 1:10)
cbind(x, 1:10)
c(x, 10)
JoFrhwld
fuente
2
Esto es exactamente lo mismo que x <- NULL, y no crea nada más que una referencia a ninguna parte.
Joris Meys
3

Como señaló Brani, vector () es una solución, por ejemplo

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

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

aVector <- c(aVector, newScalar)

Sam
fuente
2

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

Para crear vectores, si conoce Python, no debería haber ningún problema. Consulte la documentación sobre la creación de vectores.

lgautier
fuente
Solía ​​crear una función en Python para este propósito, que es muy complicado 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