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 pasar el valor para fun2 que se encuentra en fun1

Traté de mostrar las dos columnas por separado como en la imagen, pero estoy obteniendo un error en rbind(df, subrow): el número de columnas del resultado no es un múltiplo de la longitud del vector (arg 2).

expand_collapse <- function(right_table){

sector_list <- unique(right_table$Sector)
df = data.frame("Sector1"=c(""),"Sector"=c(""),"Incubatee"=c(""),"Actual"=c(""))

my_fun <- function(s){
  df1 = right_table[right_table$Sector==s,]
  sector1 = df1$Sector[1]
  Sector = df1$Sector[1]
  Incubatee = ""
  actual = as.character(nrow(df1))
  mainrow = c(sector1,Sector,Incubatee,actual) 
  df = rbind(df,mainrow)
  incubatee_list <<- unique(df1$Incubatee)
}
df = do.call(rbind,lapply(sector_list, my_fun))

my_fun2 <- function(i){
  df2 = right_table[right_table$Incubatee==i,]
  sector1 = df1$Sector[1]
  Sector = ""
  Incubatee = df2$Incubatee[1]
  actual = nrow(df2)
  subrow = c(sector1,Sector,Incubatee,actual)
  df = rbind(df,subrow)
}
df = do.call(cbind,lapply(incubatee_list, my_fun2))
df = df[2:nrow(df),]
df$Actual = as.numeric(df$Actual)
df_total = nrow(right_table)
df = rbind(df,c("","Total","",df_total))
return(df)

}

DT::datatable(expand_collapse(x), rownames = F,escape = FALSE,selection=list(mode=”single”,target=”row”),options = list(pageLength = 50,scrollX = TRUE,dom = ‘tp’,ordering=F,columnDefs = list(list(visible=FALSE, targets=0),list(className = ‘dt-left’, targets = ‘all’))),class=’hover cell-border stripe’)

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “el número de columnas del resultado no es un múltiplo de la longitud del vector (arg 2)” ocurre típicamente cuando se intenta fusionar dos marcos de datos con un número desigual de columnas.

    En el código proporcionado, el error podría ser causado por la segunda función do.call(), que aplica la función my_fun2() a cada incubado único en incubatee_list. La función my_fun2() crea una subfila, pero parece que le faltan la misma cantidad de columnas que el marco de datos principal df.

    Para resolver el error, podemos modificar la función my_fun2() para crear un marco de datos secundario con el mismo número de columnas que el marco de datos principal, y luego fusionarlo con el marco de datos principal utilizando la función rbind(). Aquí hay un ejemplo de cómo podemos modificar el código:

    my_fun2 <- function(i, main_df) {
      df2 <- right_table[right_table$Incubatee==i,]
      sector1 <- df2$Sector[1]
      sub_df <- data.frame(Sector1=sector1, Sector="", Incubatee=i, Actual=nrow(df2),
                           stringsAsFactors = FALSE)
      merged_df <- rbind(main_df, sub_df)
      return(merged_df)
    }
    
    # luego, reemplaza la función do.call() original con:
    
    df <- Reduce(my_fun2, incubatee_list, init = df[-1,], accumulate = TRUE)
    df <- df[[length(df)]]
    

    La función Reduce() aplica la función my_fun2() de manera iterativa a cada incubado único en incubatee_list y acumula el resultado en una lista. El argumento init especifica el marco de datos inicial como df[-1,] para eliminar la primera fila vacía creada anteriormente. El argumento accumulate guarda todos los resultados intermedios en la lista. Finalmente, extraemos el último elemento de la lista como el marco de datos fusionado df.

    Con esta modificación, deberíamos poder mostrar la tabla de datos con dos columnas separadas según lo deseado.

Comments are closed.