Use rle para agrupar por ejecuciones cuando use dplyr

En R, quiero resumir mis datos después de agruparlos en función de las ejecuciones de una variablex (también conocido como cada grupo de datos corresponde a un subconjunto de datos donde consecutivosx los valores son iguales) Por ejemplo, considere el siguiente marco de datos, donde quiero calcular el promedioy valor dentro de cada corrida dex:

(dat <- data.frame(x=c(1, 1, 1, 2, 2, 1, 2), y=1:7))
#   x y
# 1 1 1
# 2 1 2
# 3 1 3
# 4 2 4
# 5 2 5
# 6 1 6
# 7 2 7

En este ejemplo, elx La variable tiene carreras de longitud 3, luego 2, luego 1 y finalmente 1, tomando los valores 1, 2, 1 y 2 en esas cuatro carreras. Los medios correspondientes dey en esos grupos son 2, 4.5, 6 y 7.

Es fácil llevar a cabo esta operación agrupada en base R utilizandotapplypasandodat$y como los datos, usandorle para calcular el número de ejecución dedat$xy pasando la función de resumen deseada:

tapply(dat$y, with(rle(dat$x), rep(seq_along(lengths), lengths)), mean)
#   1   2   3   4 
# 2.0 4.5 6.0 7.0 

Pensé que podría llevar bastante directamente esta lógica a dplyr, pero mis intentos hasta ahora han terminado en errores:

library(dplyr)
# First attempt
dat %>%
  group_by(with(rle(x), rep(seq_along(lengths), lengths))) %>%
  summarize(mean(y))
# Error: cannot coerce type 'closure' to vector of type 'integer'

# Attempt 2 -- maybe "with" is the problem?
dat %>%
  group_by(rep(seq_along(rle(x)$lengths), rle(x)$lengths)) %>%
  summarize(mean(y))
# Error: invalid subscript type 'closure'

Para completar, podría volver a implementar elrle ejecutar id yo mismo usandocumsum, headytail para evitar esto, pero hace que el código de agrupación sea más difícil de leer e implica reinventar un poco la rueda:

dat %>%
  group_by(run=cumsum(c(1, head(x, -1) != tail(x, -1)))) %>%
  summarize(mean(y))
#     run mean(y)
#   (dbl)   (dbl)
# 1     1     2.0
# 2     2     4.5
# 3     3     6.0
# 4     4     7.0

¿Qué está causando mirlebasado en código de agrupación para fallardplyr, y hay alguna solución que me permita seguir usandorle al agrupar por id de ejecución?

Respuestas a la pregunta(2)

Su respuesta a la pregunta