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 puedo insertar un marco de datos en una función y luego agrupar por grupos con tapply?

Soy nuevo en la programación en R y he creado una función que me devuelve algunas estadísticas básicas a partir de una lista o vector que insertamos. El problema surge cuando quiero insertar un marco de datos (data frame).

El marco de datos que quiero insertar tiene 2 columnas; la primera se refiere a un grupo (1 o 2) y la segunda se refiere a las anchuras del cráneo en cm (valores numéricos). Me gustaría calcular la media de ambos grupos por separado para poder compararlos (1 y 2), la moda, la mediana, los cuartiles… (todo lo que tengo dentro de la función).

Se me ocurrió utilizar la función que había creado para insertar listas o vectores y luego agruparlos con la función tapply, pero me da un error en la consola, este:

Error in tapply(archivo, archivo$`Época histórica`, descriptive_statistics) :
  arguments must have same length

Aquí tienes la función y el tapply que hice:

descriptive_statistics = function(x){
  result <- list(
    mean(x), exp(mean(log(x))), median(x), modes(x),
    (range(x)[2] - range(x)[1]), var(x), sqrt(var(x)), sqrt(var(x)) / mean(x)
  )
  names(result) <- c('Media aritmética', 'Media geométrica', 'Mediana', 'Moda', 'Rango', 'Varianza', 'Desviación estándar', 'Coeficiente de variación de Pearson')

  result
}

tapply(archivo, archivo$Época histórica, descriptive_statistics)

¿Qué podría mejorar en mi función para poder ingresar marcos de datos? ¿O qué podría hacer en la función tapply para que funcione? ¿Alguien puede darme una mano con esto? También acepto otras ideas, he probado con aggregate y dentro de la función summary y demás, pero no me da las estadísticas que quiero, como el coeficiente de Pearson.

Muchas gracias de antemano, saludos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Estimado nuevo programador en R,

    Parece que el error que estás recibiendo se debe a que tapply espera un vector o lista como primer argumento, pero estás intentando pasar un dataframe. Para tomar la media de cada grupo por separado, puedes usar las funciones split y lapply. Aquí tienes un ejemplo de código que debería funcionar para ti:

    “`{r}

    Definir función para estadísticas descriptivas

    descriptive_statistics = function(x){
    result <- list(
    mean(x), exp(mean(log(x))), median(x), stats::mode(x)[1],
    (range(x)[2] – range(x)[1]), var(x), sqrt(var(x)), sqrt(var(x)) / mean(x)
    )
    names(result) <- c(‘Media aritmética’, ‘Media geométrica’, ‘Mediana’, ‘Moda’, ‘Rango’, ‘Varianza’,
    ‘Desviación estándar’, ‘Coeficiente de variación de Pearson’)
    result
    }

    Dividir el dataframe por grupos y aplicar la función de estadísticas descriptivas a la columna “widths”

    result <- lapply(split(df$widths, df$group), descriptive_statistics)

    Convertir los resultados en un dataframe para facilitar la comparación

    result_df <- do.call(rbind, result)
    row.names(result_df) <- c(“Grupo 1”, “Grupo 2”)
    result_df
    “`

    En este código, utilizamos la función split para dividir el dataframe por la columna “group” y luego aplicamos la función descriptive_statistics a la columna “widths” usando lapply. La lista resultante de estadísticas descriptivas se convierte en un dataframe para facilitar la comparación.

    Ten en cuenta que también actualicé la función modes para utilizar la proporcionada por el paquete stats, ya que la función personalizada modes puede no funcionar correctamente para todos los valores de entrada.

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

    Saludos,
    Un experto en IT especializado en R, dataframe, función, estadísticas, envstats

Comments are closed.