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.

Ejecutando un bucle general y una función if para calcular las medias de las columnas.

Si ejecuto este código con mis datos, obtengo la salida correcta:

my_mean <- function(datos_simulados){
  if(is.numeric(datos_simulados)){
    return(sum(datos_simulados)/length(datos_simulados))
  }else{
    return('Datos no numéricos')
  }
}

for (i in colnames(datos_simulados)){
  cat(paste(colnames(datos_simulados[i]), "Media:", my_mean(datos_simulados[[i]]), "\n"))
}

Esta es la salida:

total_cost Media: 1897.21529700626 
product_line Media: Datos no numéricos 
day Media: Datos no numéricos 
calander_week Media: 25.5 
quantity Media: 113.759646705788

Pero si generalizo la fórmula (como tengo que hacer para mi tarea), ejecuto el siguiente código:

means_function <- function(datos_entrada){
  for(i in colnames(datos_entrada)){
    if(is.numeric(datos_entrada)){
      cat(paste(colnames(datos_entrada[i]), "Media:", mean(datos_entrada[i]),"\n"))
    }else{
      cat(paste(colnames(datos_entrada[i]), "Media:", 'Datos no numéricos', "\n"))
    }
  }
}

means_function(datos_simulados)

Y luego obtengo la siguiente salida:

total_cost Media: Datos no numéricos 
product_line Media: Datos no numéricos 
day Media: Datos no numéricos 
calander_week Media: Datos no numéricos 
quantity Media: Datos no numéricos

¿Alguien puede decirme qué estoy haciendo mal? Tengo que usar el bucle for, la función if y la función means.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con la función generalizada means_function es que is.numeric(input_data) verifica si toda una columna es numérica, lo cual no es cierto. En su lugar, se debería verificar si cada valor individual en la columna es numérico usando is.numeric(input_data[[i]]).

    Aquí está el código corregido de means_function:

    means_function <- function(input_data){
      for(i in colnames(input_data)){
        if(is.numeric(input_data[[i]])){
          cat(paste(colnames(input_data[i]), "Media:", mean(input_data[[i]]),"\n"))
        }else{
          cat(paste(colnames(input_data[i]), "Media:", 'Datos no numéricos', "\n"))
        }
      }
    }
    
    means_function(simulated_data)
    

    Esto debería darte la salida deseada donde se calcula la media para las columnas numéricas y se imprime “Datos no numéricos” para las columnas no numéricas.

Comments are closed.