2016-08-05 2 views
0

Я хотел бы разбить его на три части, размер которых максимально равен, таким образом, что более ранние куски имеют больше записей, чем более поздние фрагменты, если равен нет возможно.Разделите данные на 3 упорядоченные куски как можно ближе к равному размеру

Скажем, у меня есть что-то вроде:

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 , 15, 16, 17, 18, 19)

я хотел бы:

[1] 
1, 2, 3, 4, 5, 6, 7 

[2] 
8, 9, 10, 11, 12, 13 

[3] 
14, 15, 16, 17, 18, 19 

я могу добиться этого, определив свою собственную функцию, используя длину x по модулю 3, пол длиной x, деленный на 3, чтобы определить размер каждого куска, но есть ли способ достичь этого в split или какой-то такой вещи, которая уже определена?

ответ

1

Использование seq_along для создания вектора показателей и использовать модуль разделения, чтобы разделить его на три куски, сортирует индексы и разделение по отсортированных показателей дают ожидаемого результата:

split(x, sort((seq_along(x) - 1)%%3)) # -1 here to convert it to zero based indices so that 
             # extra elements will always stack from earlier chunks 

# $`0` 
# [1] 1 2 3 4 5 6 7 

# $`1` 
# [1] 8 9 10 11 12 13 

# $`2` 
# [1] 14 15 16 17 18 19 
1

Разделит length из «х» на 3 и split его после тиражирования последовательности 3 с ceiling и round из «i1».

i1 <- length(x)/3 
split(x, rep(1:3, c(ceiling(i1), round(i1), floor(i1)))) 
#$`1` 
#[1] 1 2 3 4 5 6 7 

#$`2` 
#[1] 8 9 10 11 12 13 

#$`3` 
#[1] 14 15 16 17 18 19 
Смежные вопросы