【问题标题】:Using table on a list of arrays in R在R中的数组列表上使用表
【发布时间】:2021-08-17 01:13:57
【问题描述】:

假设我在 R 中有以下列表:

my_list <- list(structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 1, -1, -1, -1, -1, 0), .Dim = c(1L, 25L)), structure(c(0, 
1, -1, 0, 1, -1, 0, -1, -1, 1, 1, 1, 0, 1, 0, 0, 1, -1, 0, 1, 
-1, -1, 0, -1, 0), .Dim = c(1L, 25L)), structure(c(0, -1, -1, 
0, 1, 1, 0, -1, -1, 1, 1, 1, 0, 1, 0, 0, 1, -1, 0, 1, -1, -1, 
0, -1, 0), .Dim = c(1L, 25L)), structure(c(0, -1, -1, 0, 1, 1, 
0, 0, -1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, -1, -1, -1, -1, 0), .Dim = c(1L, 
25L)), structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
1, 0, 0, 0, 0, 1, -1, -1, -1, -1, 0), .Dim = c(1L, 25L)))

这本质上是一个包含 5 个元素的列表,每个元素都是一个数字向量(每个数组的值范围从 -1 到 1 并不重要)。

所以我想找出最频繁的数组。如果你仔细看,你会发现列表中的元素 1 和 5 是相同的。

> all(my_list[[1]] == my_list[[5]])
[1] TRUE

每个其他元素都是独一无二的。所以对于这种情况,我有 4 个唯一的数组,其中一个是最频繁的(在这种情况下,出现两次的那个!)。

我知道unique() 可以解决这个问题,为此案例提供了 4 个独特的元素。

> length(unique(my_list))
[1] 4

所以我想做的是使用table 找出最常见的唯一数组。然而,简单地使用table 会产生非常奇怪的结果。

> table(my_list)
, , my_list.3 = -1, my_list.4 = -1, my_list.5 = -1

         my_list.2
my_list.1 -1 0 1
       -1  3 0 0
       0   0 0 0
       1   0 0 0
...
# a lot more strange output from here and on

我在这里缺少什么?我不应该使用表格吗?

【问题讨论】:

    标签: r arrays list


    【解决方案1】:

    toString 这个呢?

    table(sapply(my_list, toString))
    

    给了

    0, -1, -1, 0, 1, 1, 0, -1, -1, 1, 1, 1, 0, 1, 0, 0, 1, -1, 0, 1, -1, -1, 0, -1, 0
                                                                                    1
     0, -1, -1, 0, 1, 1, 0, 0, -1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, -1, -1, -1, -1, 0
                                                                                    1
        0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -1, -1, -1, -1, 0
                                                                                    2
    0, 1, -1, 0, 1, -1, 0, -1, -1, 1, 1, 1, 0, 1, 0, 0, 1, -1, 0, 1, -1, -1, 0, -1, 0
                                                                                    1
    

    【讨论】:

      【解决方案2】:

      使用matchlist 元素转换为索引,获取匹配索引上的频率计数并根据max 计数对list 进行子集化

      i1 <- match(my_list, unique(my_list))
      tbl1 <- table(i1)
      my_list[ as.integer(names(which(tbl1==max(tbl1))))]
      

      【讨论】:

      • 是的,我考虑过使用一些与字符相关的工具,但这看起来效率不高。为什么我要花这么多时间将数字序列转换为字符?这涉及大量的粘贴和减少等等。
      • 编辑后更新:很好的答案!希望我在最初发表评论后能帮助您获得额外的想法!
      • @eduardokapp 最初我认为粘贴方法是第一个想法。当你探索时,我想得更努力了:=)
      猜你喜欢
      • 2017-01-23
      • 2020-05-27
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      相关资源
      最近更新 更多