es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede hacer referencia a un vector al crear un marco de datos usando tibble.

Me gustaría crear un marco de datos de dos columnas. La primera columna contiene solo una letra, mientras que la segunda columna contiene varias letras. El contenido en la segunda columna se almacena en un vector. Intenté usar la función tibble del paquete tibble, pero me dio resultados extraños. La segunda columna es igual que la primera columna.

library(tibble)

vec <- c("A", "B", "C")

tibble(
  vec = rep(vec[1], length(vec)),
  vec_new = vec
)
# # A tibble: 3 x 2
# vec   vec_new 
#    
# 1 A     A    
# 2 A     A    
# 3 A     A 

Intenté crear el mismo marco de datos con las funciones data.frame y data.table del paquete data.table. El resultado es el esperado. Por favor, háganme saber por qué tibble genera resultados extraños y cuál es la mejor manera de solucionarlo.

data.frame(
  vec = rep(vec[1], length(vec)),
  vec_new = vec
)
#   vec vec_new
# 1   A       A
# 2   A       B
# 3   A       C

library(data.table)
data.table(
  vec = rep(vec[1], length(vec)),
  vec_new = vec
)
#    vec vec_new
# 1:   A       A
# 2:   A       B
# 3:   A       C
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que tibble está reciclando el primer elemento del vector vec para crear la segunda columna, en lugar de utilizar los valores reales del vector. Este comportamiento se debe al uso de la función rep() en el primer argumento de la función tibble(), que repite el primer elemento de vec tantas veces como sea la longitud de vec.

    Para crear el marco de datos deseado de dos columnas con tibble, podemos utilizar la función base de R data.frame() en su lugar, y luego convertir el marco de datos resultante a un tibble utilizando la función as_tibble() del paquete tibble:

    library(tibble)
    
    vec <- c("A", "B", "C")
    
    df <- data.frame(
      vec = rep(vec[1], length(vec)),
      vec_new = vec
    )
    
    as_tibble(df)
    # A tibble: 3 x 2
      vec   vec_new
      <chr> <chr>  
    1 A     A      
    2 A     B      
    3 A     C      
    

    Alternativamente, podemos utilizar la función tibble() pasando el vector vec directamente al segundo argumento, sin usar rep():

    tibble(
      vec = rep(vec[1], length(vec)),
      vec_new = as.character(vec)  # convertir el vector a caracter para evitar cualquier problema con los tipos de datos
    )
    
    # Un tibble: 3 x 2
      vec   vec_new
      <chr> <chr>  
    1 A     A      
    2 A     B      
    3 A     C      
    

    Tenga en cuenta que las funciones data.frame() y data.table() funcionan como se espera porque no están utilizando la función rep(), y por lo tanto están utilizando correctamente los valores del vector vec para poblar la segunda columna.

Comments are closed.