2017-06-02 60 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 

定義現在假設我有兩個(或更多)的附加載體

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

對於vec2vec3怎麼可以對其進行分區,使其模仿vec的自然分區並忽略單個值或不在vec之內的值?

對於vec2

$`0` 
[1] 1 2 

$`1` 
[1] 3 

$`2` 
[1] 5 6 

$`3` 
[1] 7 

$`4` 
[1] 9 10 

,類似的還有vec3

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

和 'VEC 3'

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

這可以convertedd到功能

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

當使用分割,則在vec產生從元素組的載體;可以修改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 

清單項目名稱爲單身是不同的,但如果這事,我認爲你可以很容易地修改這個。