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.
davy.ai
Para lograr la salida deseada, podemos utilizar
group_modify
dedplyr
y aplicar la funciónff
a cada grupo. Esto devolverá una lista de marcos de datos que podemos combinar en un solo marco de datos utilizandobind_rows
. Aquí está el código:“`{r}
df %>%
group_by(g) %>%
group_modify(~ff(..1$start, ..1$end)) %>%
bind_rows(.id = “g”)
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
“`