r - 合并列表与共同元素

标签 r list merge

我有一个 list

[[1]]
[1] 7

[[2]]
[1] 10 11 12 211 446 469

[[3]]
[1] 10 11 12 13

[[4]]
[1] 11 12 13 215

[[5]]
[1] 15 16

[[6]]
[1] 15 17 216 225

我想合并具有共同元素的列表切片,并索引哪些列表切片已被合并。我想要的输出如下。
$`1`
[1] 7

$`2`, `3`, `4`
[1] 10 11 12 13 211 215 446 469

$`5`,`6`
[1] 15 16 17 216 225

(我已将原始列表切片索引作为新列表名称,但任何形式的输出都可以。)

可重现的数据:
mylist <- list(7, c(10, 11, 12, 211, 446, 469), c(10, 11, 12, 13), c(11, 
12, 13, 215), c(15, 16), c(15, 17, 216, 225))

最佳答案

这是使用“Matrix”和“igraph”包的另一种方法。

首先,我们需要提取连接了哪些元素的信息。使用稀疏矩阵可以潜在地节省大量内存使用:

library(Matrix)
i = rep(1:length(mylist), lengths(mylist)) 
j = factor(unlist(mylist))
tab = sparseMatrix(i = i, j = as.integer(j), x = TRUE, dimnames = list(NULL, levels(j)))
#as.matrix(tab)  ## just to print colnames
#         7    10    11    12    13    15    16    17   211   215   216   225   446   469
#[1,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[2,] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
#[3,] FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[4,] FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
#[5,] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[6,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE

查找每个元素是否相互连接:
connects = tcrossprod(tab, boolArith = TRUE)
#connects
#6 x 6 sparse Matrix of class "lsCMatrix"
#                
#[1,] | . . . . .
#[2,] . | | | . .
#[3,] . | | | . .
#[4,] . | | | . .
#[5,] . . . . | |
#[6,] . . . . | |

然后,使用图表,我们可以对“mylist”的索引进行分组:
library(igraph)
# 'graph_from_adjacency_matrix' seems to not work with the "connects" object directly. 
# An alternative to coercing "connects" here would be to build it as 'tcrossprod(tab) > 0'

group = clusters(graph_from_adjacency_matrix(as(connects, "lsCMatrix")))$membership
#group
#[1] 1 2 2 2 3 3

最后,连接:
tapply(mylist, group, function(x) sort(unique(unlist(x))))
#$`1`
#[1] 7
#
#$`2`
#[1]  10  11  12  13 211 215 446 469
#
#$`3`
#[1]  15  16  17 216 225

tapply(1:length(mylist), group, toString)
#        1         2         3 
#      "1" "2, 3, 4"    "5, 6" 

关于r - 合并列表与共同元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47322126/

相关文章:

R:使用 dplyr 计算 B 跟随 A 的次数

OCaml中具有特定长度的列表的列表

c# - 如何在我的 List<int> 中找到元素的索引?

git - git : Branch, fork 中相同代码的两个变体,还是创建单独的存储库?

sql-server - 合并声明和身份插入

c++ - Rcpp、C++11、 vector 和 Windows 的问题

r - LaTeX 到 RTF 的转换,包括引用和数字

r - 基于 R 中另一列值的一列值

python - 这个 for 循环代码(带有 `if not in` 条件)可以转换为列表理解吗?

python - 在 Pandas 中合并两个数据框