2017-06-02 3 views
1

Angenommen, ich habe eine Jetzt definierte Partition vonSplit ein Vektor auf einer anderen Partition auf Basis

#Partition elements of vec into adjacent chunks of size 2 
vec = seq(10) 
partition = split(vec,(seq_along(vec)-1) %/% 2) 

$`0` 
[1] 1 2 

$`1` 
[1] 3 4 

$`2` 
[1] 5 6 

$`3` 
[1] 7 8 

$`4` 
[1] 9 10 

nehme an, dass ich zwei (oder mehr) zusätzliche Vektoren

vec2 = c(1,2,3,5,6,7,9,10) 
vec3 = c(1,2,3,6,7,8,9,11,12) 

Für vec2 und vec3 wie kann ich Partitionieren Sie es so, dass es die natürliche Partition von vec nachahmt und entweder Singletons oder Werte nicht in vec ignoriert?

Für vec2:

$`0` 
[1] 1 2 

$`1` 
[1] 3 

$`2` 
[1] 5 6 

$`3` 
[1] 7 

$`4` 
[1] 9 10 

Und in ähnlicher Weise für vec3:

$`0` 
[1] 1 2 

$`1` 
[1] 3 

$`2` 
[1] 6 

$`3` 
[1] 7 8 

$`4` 
[1] 9 

$`5` 
[1] 11 

$`6` 
[1] 12 

Antwort

1

können wir Schleife durch die partition

lapply(partition, function(x) vec2[vec2 %in% x]) 

und für 'vec3'

Diese
lst <- lapply(partition, function(x) vec3[vec3 %in% x]) 
c(lst, as.list(vec3[!vec3 %in% unlist(lst)])) 

kann auf eine Funktion convertedd werden

splitFun <- function(vecN, partitionlist) { 
    lst <- lapply(partitionList, function(x) vecN[vecN %in% x]) 
    c(lst, as.list(vecN[!vecN %in% unlist(lst)])) 
} 
0

Wenn Split Verwendung Sie einen Vektor von Gruppen aus den Elementen in vec schaffen; Es ist möglich, diese Gruppen für vec2 und vec3 zu ändern.

vec = seq(10) 
vec2 = c(1,2,3,5,6,7,9,10) 
vec3 = c(1,2,3,6,7,8,9,11,12) 

groups <- (seq_along(vec)-1) %/% 2 
split(vec, groups) 
split(vec2, groups[match(vec2, vec)]) 
split(vec3, groups[match(vec3, vec)]) 

Für vec3 ist das Muster ein wenig unklar ... Sie erwähnen, dass Sie möchten Werte auszuschließen, die nicht in vec, aber Ihr Beispiel scheint, dass im Gegensatz zu laufen. Der obige Code schließt Werte aus, die nicht in vec enthalten sind, aber Gruppen können basierend darauf geändert werden, wie Sie Elemente behandeln möchten, die nicht in vec enthalten sind.

1

Es ist mehr oder weniger die gleiche Idee wie akrun hatte, aber etwas kürzer:

apply_partition <- function(vec, partition) { 
    c(lapply(partition, intersect, x = vec),  # Elements contained in the partition 
    as.list(setdiff(vec, unlist(partition)))) # Singletons which are not in the partition 
} 

Beispiele:

> apply_partition(vec2, partition) 
$`0` 
[1] 1 2 

$`1` 
[1] 3 

$`2` 
[1] 5 6 

$`3` 
[1] 7 

$`4` 
[1] 9 10 

> apply_partition(vec3, partition) 
$`0` 
[1] 1 2 

$`1` 
[1] 3 

$`2` 
[1] 6 

$`3` 
[1] 7 8 

$`4` 
[1] 9 

[[6]] 
[1] 11 

[[7]] 
[1] 12 

Die Liste Itemnamen für die Singletons sind unterschiedlich, aber wenn diese Angelegenheiten Ich denke du kannst das leicht ändern.

Verwandte Themen