每n个元素后的交织列表

时间:2018-03-22 10:26:59

标签: r list interleave

我想在每两个列表元素之后交错interElem

数据:

listi     <- c(rbind(letters[1:4], list(c(13,37))))

interElem <- c("inter","leavistan")

看起来像:

> listi
[[1]]
[1] "a"

[[2]]
[1] 13 37

[[3]]
[1] "b"

[[4]]
[1] 13 37

[[5]]
[1] "c"

[[6]]
[1] 13 37

[[7]]
[1] "d"

[[8]]
[1] 13 37

> 

期望的结果(列表元素编号不准确)

> listi
[[1]]
[1] "a"

[[2]]
[1] 13 37

[[XXX]]
[1] "inter" "leavistan"

[[3]]
[1] "b"

[[4]]
[1] 13 37

[[XXX]]
[1] "inter" "leavistan"

[[5]]
[1] "c"

[[6]]
[1] 13 37

[[XXX]]
[1] "inter" "leavistan"

[[7]]
[1] "d"

[[8]]
[1] 13 37

> 

3 个答案:

答案 0 :(得分:1)

我们可以创建一个分组变量,用gl分割每2个元素,然后在每个嵌套list的末尾添加'interElem',并用do.call(c

res <- head(do.call(c, lapply(split(listi, as.integer(gl(length(listi), 2, 
           length(listi)))), function(x) c(x, list(interElem )))), -1)
names(res) <- NULL

或另一种选择是将其转换为matrixrbind并使用'interElem'并连接到list

head(c(rbind(matrix(listi, nrow=2), list(interElem))), -1)
#[[1]]
#[1] "a"

#[[2]]
#[1] 13 37

#[[3]]
#[1] "inter"     "leavistan"

#[[4]]
#[1] "b"

#[[5]]
#[1] 13 37

#[[6]]
#[1] "inter"     "leavistan"

#[[7]]
#[1] "c"

#[[8]]
#[1] 13 37

#[[9]]
#[1] "inter"     "leavistan"

#[[10]]
#[1] "d"

#[[11]]
#[1] 13 37

或者我们可以在append循环中使用for

listn <- listi
i1 <- seq(2, length(listi), by = 2)
i2 <- i1 + (seq_along(i1) - 1)
for(i in seq_along(i2)) listn <-  append(listn, list(interElem), after = i2[i])
head(listn, -1)

答案 1 :(得分:1)

这是新列表的长度

len = length(listi) + max(0, floor((length(listi) - 1) / 2))

和应该是原始值的元素的索引

idx = seq_len(len) %% 3 != 0

使用这些列表创建新列表并插入旧值和插页式值

res = vector("list", len)
res[idx] = l
res[!idx] = list(v)

打包作为鲁棒性和重用的函数。

fun = function(l, v, n = 2) {
    ## validate arguments
    stopifnot(
        is.numeric(n), length(n) == 1, !is.na(n),
        is.list(l), is.vector(v)
    )

    ## length and index for original values
    len = length(l) + max(0, floor((length(l) - 1) / n))
    idx = seq_len(len) %% (n + 1) != 0

    ## create and populate result
    res = vector("list", len)
    res[idx] = l
    res[!idx] = list(v)
    res
}

> str(fun(listi, interElem))
List of 11
 $ : chr "a"
 $ : num [1:2] 13 37
 $ : chr [1:2] "inter" "leavistan"
 $ : chr "b"
 $ : num [1:2] 13 37
 $ : chr [1:2] "inter" "leavistan"
 $ : chr "c"
 $ : num [1:2] 13 37
 $ : chr [1:2] "inter" "leavistan"
 $ : chr "d"
 $ : num [1:2] 13 37

答案 2 :(得分:0)

这适用于您的示例和奇数长度的列表,包括2和1.如果列表的长度为奇数,matrix()cbind()会出现警告。作为条目的空列表返回插入列表。我在这里要做的就是为汇总的listilist(interElem)的以下子集形成索引向量。

l <- length(listi)
i <- rbind(matrix(1:l, nrow = 2), rep(l+1,l%/%2))[1:(l + l%/%2 - (l+1)%%2)]
c(listi, list(interElem))[i]