基于另一个分区拆分矢量

时间:2017-06-02 06:00:23

标签: r split

假设我有一个由

定义的分区
#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

3 个答案:

答案 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中的元素来修改组。