Estoy tratando de aprender R y no puedo entender cómo agregar a una lista.
Si esto fuera Python, lo haría. . .
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
¿Cómo se hace esto 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
; o podrías hacer vector = vector + valores. Pero podría estar malentendiendo su caso de usoRespuestas:
Agregar a un objeto en un bucle for hace que todo el objeto se copie en cada iteración, lo que hace que mucha gente diga "R es lento" o "Se deben evitar los bucles R".
Como mencionó BrodieG en los comentarios: es mucho mejor asignar previamente un vector de la longitud deseada, luego establecer los valores de los elementos en el bucle.
Aquí hay varias formas de agregar valores a un vector. Todos ellos están desanimados.
Agregar a un vector en un bucle
help("append")
habría respondido a su pregunta y ahorrado el tiempo que le tomó escribir esta pregunta (pero le habría causado desarrollar malos hábitos). ;-)Tenga en cuenta que
vector <- c()
no es un vector vacío; esNULL
. Si desea un vector de caracteres vacío, usevector <- character()
.Preasignar el vector antes de repetir
Si absolutamente debe usar un bucle for, debe preasignar todo el vector antes del bucle. Esto será mucho más rápido que agregar para vectores más grandes.
fuente
vector <- character(length(values)); for(...
)?FWIW: análogo al apéndice de Python ():
fuente
b <- 1; b <- append(b, 2)
. Pero como mencionas, c () es una forma más R de hacer las cosas.Tienes pocas opciones:
c(vector, values)
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
El primero es el enfoque estándar. El segundo te da la opción de agregar otro lugar que no sea el final. El último está un poco retorcido pero tiene la ventaja de modificarse
vector
(aunque en realidad, podría hacerlo con la misma facilidad)vector <- c(vector, values)
.Tenga en cuenta que en R no necesita recorrer los vectores. Puede operarlos en su totalidad.
Además, esto es bastante básico, por lo que debe revisar algunas de las referencias .
Algunas opciones más basadas en comentarios OP:
fuente
c
para agregar un marco de datos en lugar de vectores?Solo en aras de la integridad, agregar valores a un vector en un bucle for no es realmente la filosofía en R. R funciona mejor operando en vectores en su conjunto, como señaló @BrodieG. Vea si su código no puede reescribirse como:
La salida será un vector de valores de retorno. También puede usar
lapply
if values es una lista en lugar de un vector.fuente
A veces tenemos que usar bucles, por ejemplo, cuando no sabemos cuántas iteraciones necesitamos para obtener el resultado. Tome los bucles while como ejemplo. A continuación se detallan los métodos que debe evitar:
Estos son muy ineficientes porque R copia el vector cada vez que se agrega.
La forma más eficiente de agregar es usar index. Tenga en cuenta que esta vez lo dejé iterar 1e7 veces, pero aún es mucho más rápido que
c
.Esto es aceptable Y podemos hacerlo un poco más rápido reemplazando
[
con[[
.Tal vez ya haya notado que
length
puede llevar mucho tiempo. Si reemplazamoslength
con un contador:Como mencionaron otros usuarios, la preasignación del vector es muy útil. Pero esto es una compensación entre la velocidad y el uso de la memoria si no sabe cuántos bucles necesita para obtener el resultado.
Un método intermedio es agregar gradualmente bloques de resultados.
fuente
En R, puedes probar de esta manera:
fuente
fuente
Lo que estás usando en el código de Python se llama una lista en Python, y es muy diferente de los vectores R, si obtengo lo que quieres hacer:
fuente