Mostrando entradas con la etiqueta ChickWeight. Mostrar todas las entradas
Mostrando entradas con la etiqueta ChickWeight. Mostrar todas las entradas

2018-06-25

Media aritmética ponderada en R

Problema

Deseamos calcular la media ponderada de un conjunto de datos con R

Solución

Utilizamos al función weighted.mean del paquete base.

  • Ejemplo de la documentación de R
  • wt <- c(5,  5,  4,  1)/15 # No es necesario dividir entre 15
    x <- c(3.7, 3.3, 3.5, 2.8)
    xm <- weighted.mean(x, wt)
    
    [1] 3.453333
    
  • Ejemplo por grupos
  • Utilizamos el paquete dplyr y el conjunto de datos ChickWeight para calcular la media ponderada por grupo. Pondero por la variable Time a modo ilustrativo. Añado la media aritmética sin ponderar para permitir la comparación.

    library(dplyr)
    # Si queremos calcular el total
    with(ChickWeight, weighted.mean(weight, Time))
    # Por grupo
    ChickWeight %>%
      group_by(Diet) %>% 
       summarise(mean =  mean(weight), wm = weighted.mean(weight, Time)) 
    
    # A tibble: 4 x 3
      Diet   mean    wm
        
    1 1      103.  132.
    2 2      123.  159.
    3 3      143.  191.
    4 4      135.  176.
    

    Entradas relacionadas

    2015-11-25

    Dividir un data frame en los grupos definidos por una columna en R

    Title

    Problema

    Queremos dividir un data frame por una de las columnas, creando tantos data frames como grupos contiene la columna. Por ejemplo, dividiremos el data frame ChickWeight por la columna Chick que identifica 50 tipos de polluelos.

    str(ChickWeight$Chick)
    
    Ord.factor w/ 50 levels "18"<"16"<"15"<..: 15 15 15 15 15 15 15 15 15 15 ...
    

    Solución

  • Crear una lista de data frames.
  • ldf <- split(ChickWeight, ChickWeight$Chick)
    
    Para acceder a un data frame de la lista de 50, por ejemplo el 20:
    ldf$`20`
        weight Time Chick Diet
    209     41    0    20    1
    210     47    2    20    1
    211     54    4    20    1
    212     58    6    20    1
    213     65    8    20    1
    214     73   10    20    1
    215     77   12    20    1
    216     89   14    20    1
    217     98   16    20    1
    218    107   18    20    1
    219    115   20    20    1
    220    117   21    20    1
    
    Sin embargo, para prescindir de los números como nombres de data frames, creamos una nueva columna en la que anteponemos a cada número la cadena de texto Chick_.

    ChickWeight$id <- paste0("Chick_", ChickWeight$Chick)
    # Creamos la lista de nuevo
    ldf <- split(ChickWeight, ChickWeight$id)
    # Accedemos a un data frame
    ldf$Chick_20
    
  • Crear data frames independientes
  • Si queremos crear un objeto separado para cada data frame en nuestro entorno de trabajo.

    list2env(ldf, .GlobalEnv)
    En nuestro entorno habremos creado 50 data frames.

    Referencias

    Nube de datos