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.

Aplicación agrupada de funciones que devuelven un data.frame (sin un bucle for).

Necesito aplicar una función que devuelva un data.frame en un tibble agrupado.

Algunos datos:

df <- data.frame(start=1:10,end=21:30,g=sample(LETTERS[1:2],10,replace=TRUE))
ff <- function(start,end,... ) {
  out <- data.frame(T1=c(start,rev(start)),T2=c(end,rev(end)))
  return(out)
}

Luego, me gustaría hacer algo como esto:

library(dplyr)
library(purrr)

df %>%
  group_by(g) %>%
  pmap_dfr( ff,.keep=TRUE)

Para producir un tibble/data.frame como este:

g start end
1 A 1 21
2 A 3 23
3 A 4 24
4 A 5 25
5 A 6 26
6 A 7 27
7 A 8 28
8 A 8 28
9 A 7 27
10 A 6 26
11 A 5 25
12 A 4 24
13 A 3 23
14 A 1 21
15 B 2 22
16 B 9 29
17 B 10 30
18 B 10 30
19 B 9 29
20 B 2 22

De esta manera, la salida se concatena juntos en filas y se marca de alguna manera el grupo al que pertenece.

Las funciones que quiero aplicar necesitan obtener argumentos de las otras columnas en el data.frame original (df en el código de ejemplo), así que pensé que pmap_dfr sería la función correcta para usar. Pero simplemente estoy confundido con la salida, así que debo estar usando esa función de manera incorrecta.

Agradecería toda la ayuda que pudiera obtener sobre esto.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la salida deseada, podemos utilizar group_modify de dplyr y aplicar la función ff a cada grupo. Esto devolverá una lista de marcos de datos que podemos combinar en un solo marco de datos utilizando bind_rows. Aquí está el código:

    “`{r}
    df %>%
    group_by(g) %>%
    group_modify(~ff(..1$start, ..1$end)) %>%
    bind_rows(.id = “g”)


    Explicación: - `group_by(g)` agrupa el marco de datos por la variable `g`. - `group_modify` aplica la función `ff` a cada grupo (`~ff(..1$start, ..1$end)`) y devuelve una lista de marcos de datos. - `bind_rows` combina la lista de marcos de datos en un solo marco de datos, agregando una nueva columna llamada "g" para indicar el grupo al que pertenece cada fila. Esto debería dar la salida deseada:

    A tibble: 20 x 3

    g T1 T2

    1 A 1 21
    2 A 3 23
    3 A 4 24
    4 A 5 25
    5 A 6 26
    6 A 7 27
    7 A 8 28
    8 A 8 28
    9 A 7 27
    10 A 6 26
    11 A 5 25
    12 A 4 24
    13 A 3 23
    14 A 1 21
    15 B 2 22
    16 B 9 29
    17 B 10 30
    18 B 10 30
    19 B 9 29
    20 B 2 22
    “`

Comments are closed.