假设我有一个由
定义的分区#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)
对于vec2
和vec3
,如何对其进行分区,使其模仿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
答案 0 :(得分: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)]))
这可以转换为函数
splitFun <- function(vecN, partitionlist) {
lst <- lapply(partitionList, function(x) vecN[vecN %in% x])
c(lst, as.list(vecN[!vecN %in% unlist(lst)]))
}
答案 1 :(得分: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
单身人士的名单项目名称不同,但如果这很重要,我认为你可以很容易地修改它。
答案 2 :(得分: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
中的元素来修改组。