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.

¿Cómo llenar un marco de datos vacío por columnas?

Tengo un marco de datos vacío y quiero llenar este marco de datos agregando nuevas columnas, pero cuando ejecuto el código, arroja el siguiente error:

Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 0, 102

Sé que el problema es que mi marco de datos vacío no tiene un número de fila. Mi pregunta es: ¿hay alguna forma de llenar un marco de datos vacío cuando no sabe cuántas filas tendrán sus columnas? En otras palabras, cuando no hay número de fila en el marco de datos vacío.

Actualmente estoy intentando:

df <- data.frame()
for (i in 1:(length(hojas)-1)) {
  dat <- read_excel(". . .", sheet = sheet_names[i])
  df <- cbind(df, dat)
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de llenar un data frame vacío cuando no se sabe cuántas filas tendrán sus columnas. Un enfoque es crear un data frame vacío con los nombres y tipos de datos de columna correctos y luego usar un bucle o función apply para completar los valores.

    Aquí hay un ejemplo utilizando su código:

    # Crear data frame vacío con nombres de columna
    df <- data.frame(matrix(ncol = length(hojas)-1, nrow = 0))
    colnames(df) <- hojas[1:(length(hojas)-1)]
    
    # Bucle para recorrer hojas y agregar datos a data frame
    for (i in 1:length(hojas)-1) {
      dat <- read_excel(". . .", sheet = sheet_names[i])
      df <- cbind(df, dat)
    }
    

    En este ejemplo, creamos un data frame vacío con matrix(ncol = length(hojas)-1, nrow = 0). Esto crea una matriz con el número correcto de columnas y 0 filas, que luego convertimos en un data frame con data.frame(). Luego agregamos los nombres de las columnas con colnames(df) <- hojas[1:(length(hojas)-1)].

    En el bucle, leemos los datos de cada hoja y usamos cbind() para agregarlos al data frame. Como cbind() automáticamente coincide el número de filas, no necesitamos preocuparnos por el data frame vacío inicial que tiene 0 filas.

    Alternativamente, podríamos usar una función apply para aplicar la misma función a múltiples hojas usando un bucle.

    # Crear data frame vacío con nombres de columna
    df <- data.frame(matrix(ncol = length(hojas)-1, nrow = 0))
    colnames(df) <- hojas[1:(length(hojas)-1)]
    
    # Definir función para leer datos y agregar al data frame
    add_data <- function(sheet_name) {
      dat <- read_excel(". . .", sheet = sheet_name)
      df <<- cbind(df, dat)
    }
    
    # Usar lapply para aplicar función a cada hoja
    lapply(sheet_names[1:(length(hojas)-1)], add_data)
    

    En este ejemplo, definimos una función add_data() que lee los datos de una hoja y los agrega a la variable global df. Luego usamos lapply() para aplicar esta función a cada hoja en sheet_names, lo que crea automáticamente una lista de data frames. Luego usamos do.call() para combinar la lista de data frames en un solo data frame. El uso de <<- en lugar de <- asegura que los cambios en la variable df se hagan globalmente, en lugar de solo dentro de la función.

Comments are closed.