如何基于r中另一个向量的值将向量列表拆分为子列表

时间:2018-11-13 11:56:54

标签: r

假设我有一个向量x的列表,如下所示:

> x <- list(x1=c(1,2,3), x2=c(1,4,3), x3=c(3,4,6), x4=c(4,8,4), x5=c(4,33,4), x6=c(9,6,7))

假设我还有另外两个向量yy1这样:

 y <- c(3,3)
 y1 <- c(2,4)

我想基于xy的值拆分y1。例如, 对于y,我想将x分成两个子列表,它们的向量数相同(每个子列表中有3个向量)

对于y1,我想将x分成两个具有不同数量向量的子列表,其中第一个子列表包含2个向量,第二个子列表包含4个向量。

我尝试过:

> z <- split(x, y[1]))

但这不是我所期望的。

输出应如下:

基于y

sublist_1 = list(x1, x2, x3), 

sublist_2= list(x4,x5,x6)

基于y1

sublist_1 = list(x1, x2). 
sublist_2= list(x1, x2, x3, x4).

有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

我们可以使用split通过创建要拆分的组来将列表拆分为元素。

split(x, rep(c(1, 2), y))

#$`1`
#$`1`$x1
#[1] 1 2 3

#$`1`$x2
#[1] 1 4 3

#$`1`$x3
#[1] 3 4 6


#$`2`
#$`2`$x4
#[1] 4 8 4

#$`2`$x5
#[1]  4 33  4

#$`2`$x6
#[1] 9 6 7

我们还可以编写一个函数来完成此操作

split_list <- function(x, split_var) {
  split(x, rep(1:length(split_var), split_var))
}

split_list(x, y1)
#$`1`
#$`1`$x1
#[1] 1 2 3

#$`1`$x2
#[1] 1 4 3


#$`2`
#$`2`$x3
#[1] 3 4 6

#$`2`$x4
#[1] 4 8 4

#$`2`$x5
#[1]  4 33  4

#$`2`$x6
#[1] 9 6 7