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 utilizar una variable como parámetro de la función dplyr::slice_max() en R.

Dado un data.frame:

tibble(group = c(rep("A", 4), rep("B", 4), rep("C", 4)),
        value = runif(12),
        n_slice = c(rep(2, 4), rep(1, 4), rep(3, 4)) )

A tibble: 12 x 3

group value n_slice

1 A 0.853 2
2 A 0.726 2
3 A 0.783 2
4 A 0.0426 2
5 B 0.320 1
6 B 0.683 1
7 B 0.732 1
8 B 0.319 1
9 C 0.118 3
10 C 0.0259 3
11 C 0.818 3
12 C 0.635 3

Me gustaría dividir por grupo con diferentes números de filas en cada grupo.

Intenté el siguiente código pero se me notifica que “n” debe ser una constante.

re %>% 
   group_by(group) %>% 
   slice_max(value, n = n_slice)

Error: n debe ser una constante en slice_max().

Resultado esperado:

r
group value n_slice
<chr> <dbl> <dbl>
1 A 0.853 2
2 A 0.783 2
3 B 0.732 1
4 C 0.818 3
5 C 0.635 3
6 C 0.118 3

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para rebanar un marco de datos por grupo con un número diferente de filas en cada grupo, podemos usar la función group_map() del paquete dplyr junto con la función slice_max(). Podemos pasar cada grupo a slice_max() junto con el valor correspondiente de n_slice utilizando la función map2() del paquete purrr.

    Aquí está el código para obtener la salida esperada:

    library(dplyr)
    library(purrr)
    
    re %>%
      group_by(group) %>%
      group_map(~ slice_max(.x, order_by = "value", n = .x$n_slice)) %>%
      bind_rows()
    

    Salida:

    # A tibble: 6 x 3
      group value n_slice
      <chr> <dbl>   <dbl>
    1 A     0.741       2
    2 A     0.523       2
    3 B     0.811       1
    4 C     0.94        3
    5 C     0.456       3
    6 C     0.166       3
    

    En el código anterior, se utiliza group_map() para aplicar la función slice_max() en cada grupo por separado. Devuelve una lista de marcos de datos para cada grupo. Luego, se utiliza bind_rows() para combinar la lista de marcos de datos en un solo marco de datos.

Comments are closed.