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

清单项目名称为单身是不同的,但如果这事,我认为你可以很容易地修改这个。