2017-06-02 6 views
1

に基づくベクターは、私がスプリット別のパーティション

#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 

によって定義されたパーティションは今、私は2つ(またはそれ以上)があるとしているとし、追加のベクトルvec2vec3どのようにすることができますについては

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

vecという自然なパーティションを模倣し、vecにないシングルトンまたは値を無視するようにパーティションを分割しますか? vec2については

vec3ため
$`0` 
[1] 1 2 

$`1` 
[1] 3 

$`2` 
[1] 5 6 

$`3` 
[1] 7 

$`4` 
[1] 9 10 

と同様:

$`0` 
[1] 1 2 

$`1` 
[1] 3 

$`2` 
[1] 6 

$`3` 
[1] 7 8 

$`4` 
[1] 9 

$`5` 
[1] 11 

$`6` 
[1] 12 

答えて

1

我々はpartition

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

と 'vec3'

ためのループスルーすることができます
lst <- lapply(partition, function(x) vec3[vec3 %in% x]) 
c(lst, as.list(vec3[!vec3 %in% unlist(lst)])) 

これは分割を使用する場合、あなたはvecの要素からグループのベクトルを作成する

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

関数にconverteddすることができます。 vec2とvec3のグループを変更することは可能です。

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)]) 

vec3ためのパターンが少し不明である...あなたがいないvecに値を除外したいことは言うが、あなたの例では、それに反するように思われます。上記のコードではvecに含まれていない値は除外されますが、グループはvecにない要素をどのように扱うかに基づいて変更できます。

1

それはakrunが持っていたのと同じ考え方多かれ少なかれだが、少し短い:

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 
} 

例:

> 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 

シングルトンのためのリスト項目名が異なっているが、これは重要な場合、私はあなたが簡単にこれを変更することができると思います。