En R, ¿cómo agrega una nueva fila a un marco de datos una vez que el marco de datos ya se ha inicializado?
Hasta ahora tengo esto:
df <- data.frame("hi", "bye")
names(df) <- c("hello", "goodbye")
#I am trying to add "hola" and "ciao" as a new row
de <- data.frame("hola", "ciao")
merge(df, de) # Adds to the same row as new columns
# Unfortunately, I couldn't find an rbind() solution that wouldn't give me an error
Cualquier ayuda sería apreciada
de
también.names(de) <- c("hello","goodbye")
yrbind
rbind(df, setNames(de, names(df)))
rbind(data.frame(a = 1), data.frame(b = 2))
... ¿por qué quieres hacerlo? Espero que arroje un error independientemente. Es como estarmerge
con unaby
variable aleatoria . Y esto es 2015, ¿no están todos listosoptions(stringsAsFactors = FALSE)
?stringsAsFactors=FALSE
puede ser una solución rápida, pero cambiar los valores predeterminados que otras personas establecerán de manera diferente realmente puede arruinar un día.Respuestas:
Como @Khashaa y @Richard Scriven señalan en los comentarios, debe establecer nombres de columna consistentes para todos los marcos de datos que desea agregar.
Por lo tanto, debe declarar explícitamente los nombres de las columnas para el segundo marco de datos
de
y luego usarlosrbind()
. Solo establece los nombres de columna para el primer marco de datosdf
:fuente
newdf<-rbind(df, data.frame(hello="hola", goodbye="ciao"))
O con variable:newdf<-rbind(df, data.frame(hello=var1, goodbye=var2))
Hagámoslo simple:
fuente
df[nrow(df) + 1, 1:2] = c("v1", "v2")
ydf[nrow(df), 3] = 100
aún así es un buen punto sobre agregar una nueva fila. Entonces, +1list()
. Revertí tu edición.O, inspirado por @MatheusAraujo:
df[nrow(df) + 1,] = list("v1","v2")
Esto permitiría tipos de datos mixtos.
fuente
Ahora hay
add_row()
de los paquetestibble
otidyverse
.Las columnas no especificadas obtienen un
NA
.fuente
rbind
yas.matrix
debajoMe gusta en
list
lugar dec
porque maneja mejor los tipos de datos mixtos. Agregar una columna adicional a la pregunta del póster original:Tenga en cuenta que se requiere algún control adicional si la conversión de cadena / factor es importante.
O usando las variables originales con la solución de MatheusAraujo / Ytsen de Boer:
Tenga en cuenta que esta solución no funciona bien con las cadenas a menos que haya datos existentes en el marco de datos.
fuente
hello
ygoodbye
están en el personajedf
, puede hacer lo siguiente. No necesariamente usa nombres en una lista.df <- data.frame(hello = "hi", goodbye = "bye", volume = 1,stringsAsFactors = FALSE); rbind(df, list("hola", "ciao", 100))
.No es terriblemente elegante, pero:
De la documentación de la
rbind
función:fuente
Necesito agregar
stringsAsFactors=FALSE
al crear el marco de datos..
fuente
Asegúrese de especificar
stringsAsFactors=FALSE
al crear el marco de datos:Si no se usa
stringsAsFactors=FALSE
al crear el marco de datos, se producirá el siguiente error al intentar agregar la nueva fila:fuente
Hay una manera más simple de agregar un registro de un marco de datos a otro SI sabe que los dos marcos de datos comparten las mismas columnas y tipos. Para añadir una fila a partir
xx
deyy
simplemente hacer lo siguiente dondei
es lai
'th en filaxx
.Simple como eso. Sin ataduras desordenadas. Si necesita agregar todo
xx
ayy
, entonces llame a un bucle o aproveche las habilidades de secuencia de R y haga esto:fuente
Si desea crear un marco de datos vacío y agregar contenido en un bucle, lo siguiente puede ayudar:
Espero eso ayude :)
fuente