r - 每 n 个元素之后交错列表

标签 r list interleave

我想在每 2 个列表元素之后交错 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

> 

最佳答案

这是新列表的长度

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

关于r - 每 n 个元素之后交错列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49426226/

相关文章:

javascript - 如何将项目存储在 firebase 列表中的特定位置

c - 如何对像素数据进行位 strip 化?

java - 交错式立体声 PCM 线性 Int16 大端音频是什么样的?

python - 交错形状不匹配的 NumPy 数组

r - 当行包含的元素多于数据框中的列时,向数据框中添加行

r - 如何使用 R 测试多个时间序列之间的差异

linux - 在 R 中运行命令后变量意外更改

c++ - C++ 编译器如何扩展模板 <> 代码以及它如何影响相同的速度?

python - 如何将excel数据拉入列表以使用python?

r - 从数据框中成对的重复删除