вот кадр данных с dput
d <- structure(list(Var1 = c(20L, 50L, 80L, 150L, 250L), Var2 = c(0.4,
0.5, 0.6, 0.3, 0.4), Var3 = structure(c(1L, 1L, 2L, 1L, 2L), .Label = c("a",
"b"), class = "factor")), class = "data.frame", row.names = c(NA,
-5L))
Я бы
- создал несколько временных столбцов, чтобы определить, когда новая группа начинает
- группуи вычислить среднее значение, но также отследить различные значения изменения Var3
- , чтобы смешать, если более чем одно значение Var3 в группе
в тидиверсе, это может выглядеть как
d %>%
# make sure we sort Var1
arrange(Var1) %>%
# increment var1 by 50 and test that against the next row
# if the next value exceeds current by 50, we mark it as a new group
mutate(nextint=Var1+50,
newgroup=Var1>lag(nextint,default=-Inf),
grp=cumsum(newgroup)) %>%
# for each group, get the mean and a comma separated list of distinct Var3 values
group_by(grp) %>%
summarise(
grplbl=floor(max(Var1)/50)*50,
mu=mean(Var2),
mix=paste(collapse=",",unique(Var3))) %>%
# if mix (distinct Var3) has a comma in it, change from e.g. 'a,b' to 'mix'
mutate(mix=ifelse(grepl(',', mix), 'mixed', mix))
# A tibble: 3 x 4
grp grplbl mu mix
<int> <dbl> <dbl> <chr>
1 1 50 0.5 mixed
2 2 150 0.3 a
3 3 250 0.4 b