2016-08-05 3 views
0

Ich möchte dies in drei Chunks teilen, deren Größe so gleich wie möglich ist, so dass frühere Chunks mehr Einträge als spätere Chunks haben Gleichheit ist nicht möglich.Teilen Sie Daten in 3 geordnete Chunks von As-Close-to-Größe wie möglich

Sagen, ich habe so etwas wie:

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

Ich mag würde:

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

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

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

ich dies durch die Definition meine eigene Funktion, mit der Länge von x Modulo 3 kann erreichen und der Boden der Länge von x geteilt durch 3, um die Größe von jedem Stück zu bestimmen, aber gibt es einen Weg, um dies zu erreichen in split oder einige solche Dinge, die bereits definiert ist?

Antwort

1

seq_along Verwenden einen Vektors von Indizes zu erzeugen und verwenden Modulteilung in drei Stücke zu unterteilen, sortieren, die Indizes und die Spalte auf dem sortierten Indizes gibt das erwartete Ergebnis:

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

Wir teilen die length von ‚x‘ von 3 und split es nach der Sequenz von 3 mit ceiling und round von ‚i1‘ replizieren.

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 
Verwandte Themen