【问题标题】:Count the number of how often a number occurs across list elements计算一个数字在列表元素中出现的频率
【发布时间】:2021-08-31 04:39:11
【问题描述】:

假设我有一个包含 5 个向量的列表,其中填充了 1 到 d 之间的整数,其中 d 可以是任何整数

d = 30  #Intergers that I want to count, i.e. 1:30

set_list <- list(s1 = c(2,4,3,1,20,30), s2 = c(3,30,23,1,3,4), 
             s3=c(3,4,5,13,15,12, 23:29, 30), s4 = c(1:10, 13:15, 17),
             s5 = c(15:20, 23))

如果不对列表元素 1-5 和整数 1-30 使用双循环,我想计算从 1 到 d 的每个整数在列表中出现的次数。例如。 1 出现 3 次,2 出现 2 次,3 出现 3 次,以此类推。 请注意,我总是想检查 1 和 d 之间的所有整数,而不仅仅是列表中出现的整数。所以 d 可以远大于 set_list 中的最大整数,例如 d=50。因此,我不能使用表格功能。我想出了如何使用 2 个 for 循环来做到这一点,但我认为这不是最佳解决方案。

【问题讨论】:

    标签: r list apply data-manipulation


    【解决方案1】:
    table(ordered(unlist(set_list), levels = seq_len(d)))[seq_len(d)]
    

    【讨论】:

    • 列表中并非 1:30 的所有数字,因此这些数字不会得到 0 计数。
    • 是的,你是对的。我没有正确检查。
    【解决方案2】:

    您可以使用vapply 来执行此操作(假设您想要一个整数向量):

    vapply(seq_len(d), 
           function(x) {
             sum(x == unlist(set_list))
           }, 
           1L)
    

    purrr::map_int:

    purrr::map_int(seq_len(d), ~sum(. == unlist(set_list)))
    

    【讨论】:

    • 是的,谢谢你,效果很好。我认为 sapply 也可以代替 vapply
    • 我只是习惯使用vapply,因为我更喜欢指定返回值类型,但是是的,sapply 这里应该没问题
    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 2014-04-18
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2016-12-30
    相关资源
    最近更新 更多