我有一个列表,其中的元素要么包含单个整数,要么包含整数向量.

int_list <- list(
    c(1, 15),
    c(3, 19),
    c(2, 16),
    c(4, 19),
    c(5, 21),
    c(19, 28),
    c(28, 30),
    17
)

如您所见,第二个和第四个元素包含整数19.我想将这些情况合并到一个向量中.因此,在这种情况下预期/期望的结果将是:

int_list_merged <- list(
    c(1, 15),
    c(3, 4, 19, 28, 30),
    c(2, 16),
    c(5, 21),
    17
)

我怎样才能做到这一点呢?

推荐答案

list(c(1,2), c(2,3), c(3,4))返回list(c(1,2,3,4))的条件意味着我们必须遍历列表,直到它停止更改.

我们可以使用递归函数,该函数在满足该条件时停止调用自身.

create_merged_list <- function(l, check_finished_list = NULL) {
    new_l <- unique(lapply(seq(l), \(i) merge_elements(l, i)))

    if (identical(check_finished_list, new_l)) {
        return(new_l)
    }
    create_merged_list(new_l, l)
}

这次调用的主要函数是merge_elements(),它迭代列表的每个元素,将其与与其共享值的其他元素合并,并返回一个新的列表.

merge_elements <- function(l, i) {
    l_compare <- l[-i]
    el <- l[[i]]
    match_vals <- which(outer(el, unlist(l_compare), \(x, y) x == y), arr.ind = TRUE)[, "col"]

    if (!length(match_vals)) {
        return(el)
    }

    l_breaks <- cumsum(lengths(l_compare))

    l_match_idx <- vapply(match_vals, \(x) min(which(x <= l_breaks)), integer(1))
    new_el <- sort(unique(c(el, unlist(l_compare[l_match_idx]))))
    new_el
}

输出

create_merged_list(int_list) 
# [[1]]
# [1]  1 15

# [[2]]
# [1]  3  4 19 28 30

# [[3]]
# [1]  2 16

# [[4]]
# [1]  5 21

# [[5]]
# [1] 17

identical(create_merged_list(int_list), int_list_merged) 
# [1] TRUE

R相关问答推荐

r带有参考年的两年移动平均线

使用格式化程序自定义hc_tooltip以添加textColor删除了我的标记并try 将它们带回失败

高质量地将R格式的图表从Word中输出

从R中的另一个包扩展S3类的正确方法是什么

如果行和大于值,则过滤

任意列的欧几里得距离

在R中替换函数中的特定符号

如何使用R对每组变量进行随机化?

根据多个条件增加y轴高度以适应geom_text标签

未识别时区

使用整齐的计算(curl -curl )和杂音

在ggplot2的框图中绘制所有级别的系数

R中的哈密顿滤波

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

将标识符赋给事件序列,避免错误观察

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

随机 Select 的非NA列的行均数

在r中整理图例和堆叠图的问题

数据集上的R循环和存储模型系数

如何在R中创建这些列?