Предполагая, что вам нужно алфавитное решение, как показано в ожидаемом результате; Вы могли бы округлить cumsum
s, деленное на желаемое количество разбиений (то есть 9
), что должно изменить потолок и пол и распределить группы более равномерно. В результате получается вектор x
с индикаторами разделения, назначенными каждой категории вашей переменной group
. x
, разделенный сам по себе, затем дает список, на который можно разделить фрейм данных с помощью lapply
.
x <- round(cumsum(table(dat$group)) / (nrow(dat) / 9))
result <- lapply(lapply(split(x, x), names), function(i) dat[dat$group %in% i, ])
Распределение строк в списке результатов
t(Map(nrow, result))
# 1 2 3 4 5 6 7 8 9
# [1,] 11 6 9 8 7 7 8 7 7
> sapply(result, "[", 2)
$`1.group`
[1] "a" "a" "a" "a" "a" "b" "b" "b" "b" "b" "b"
$`2.group`
[1] "c" "d" "d" "e" "e" "f"
$`3.group`
[1] "g" "g" "g" "g" "i" "j" "j" "j" "j"
$`4.group`
[1] "k" "k" "l" "l" "l" "l" "l" "l"
$`5.group`
[1] "n" "n" "o" "p" "p" "p" "p"
$`6.group`
[1] "q" "q" "q" "q" "r" "r" "r"
$`7.group`
[1] "s" "s" "s" "t" "u" "u" "u" "v"
$`8.group`
[1] "w" "w" "w" "x" "x" "x" "x"
$`9.group`
[1] "y" "y" "y" "y" "z" "z" "z"
Данные
dat <- structure(list(value = c(43L, 22L, 1L, 5L, 4L, 18L, 32L, 33L,
47L, 43L, 35L, 24L, 3L, 12L, 13L, 6L, 45L, 12L, 5L, 22L, 47L,
35L, 20L, 36L, 34L, 15L, 22L, 9L, 41L, 1L, 7L, 2L, 21L, 3L, 8L,
33L, 12L, 39L, 19L, 2L, 34L, 45L, 7L, 22L, 24L, 25L, 20L, 19L,
45L, 36L, 25L, 23L, 47L, 13L, 45L, 36L, 23L, 14L, 12L, 15L, 12L,
11L, 25L, 31L, 41L, 14L, 38L, 15L, 13L, 6L), group = c("a", "a",
"a", "a", "a", "b", "b", "b", "b", "b", "b", "c", "d", "d", "e",
"e", "f", "g", "g", "g", "g", "i", "j", "j", "j", "j", "k", "k",
"l", "l", "l", "l", "l", "l", "n", "n", "o", "p", "p", "p", "p",
"q", "q", "q", "q", "r", "r", "r", "s", "s", "s", "t", "u", "u",
"u", "v", "w", "w", "w", "x", "x", "x", "x", "y", "y", "y", "y",
"z", "z", "z")), row.names = c(6L, 21L, 50L, 66L, 69L, 15L, 36L,
46L, 48L, 62L, 67L, 34L, 18L, 54L, 31L, 51L, 3L, 7L, 9L, 24L,
39L, 55L, 8L, 11L, 27L, 29L, 59L, 70L, 19L, 23L, 40L, 45L, 52L,
68L, 26L, 43L, 44L, 16L, 38L, 63L, 65L, 10L, 49L, 56L, 61L, 1L,
13L, 64L, 22L, 35L, 47L, 4L, 25L, 33L, 53L, 37L, 14L, 17L, 60L,
2L, 5L, 12L, 57L, 28L, 32L, 41L, 42L, 20L, 30L, 58L), class = "data.frame")