【问题标题】:R: Count frequency of values in nested list with sub-elementsR:计算具有子元素的嵌套列表中值的频率
【发布时间】:2021-02-09 12:22:45
【问题描述】:

我有一个包含国家名称的嵌套列表。 我想计算国家的频率,即在子列表中每次提及都会添加 +1(无论该国家在该子列表中被提及的频率如何)。

例如,如果我有这个列表:

[[1]]
[1] "Austria" "Austria" "Austria"

[[2]]
[1] "Austria" "Sweden"

[[3]]
[1] "Austria" "Austria" "Sweden"  "Sweden" "Sweden" "Sweden"

[[4]]
[1] "Austria" "Austria" "Austria"

[[5]]
[1] "Austria" "Japan" 

...那么我希望结果是这样的:

country        freq
====================
Austria         5
Sweden          2
Japan           1

我已经尝试过使用lapplyunlisttable 等的各种方法,但没有一种方法能达到我需要的效果。非常感谢您的帮助!

【问题讨论】:

    标签: r list frequency nested-lists


    【解决方案1】:

    一种方法是以数据框格式获取数据并计算每个国家/地区出现的唯一元素。

    library(dplyr)
    
    tibble::enframe(lst) %>%
      tidyr::unnest(value) %>%
      group_by(value) %>%
      summarise(freq = n_distinct(name))
    
    
    # value    freq
    #  <chr>   <int>
    #1 Austria     5
    #2 Japan       1
    #3 Sweden      2
    

    数据

    lst <- list(c('Austria', 'Austria', 'Austria'), c("Austria", "Sweden"), 
         c("Austria", "Austria", "Sweden",  "Sweden", "Sweden", "Sweden"), 
         c("Austria", "Austria", "Austria"), c("Austria", "Japan" ))
    

    【讨论】:

      【解决方案2】:

      lapply()unlist()table() 的一种方式:

      count <- table(unlist(lapply(lst, unique)))
      count
      # Austria   Japan  Sweden 
      #       5       1       2 
      
      
      as.data.frame(count)
      #      Var1 Freq
      # 1 Austria    5
      # 2   Japan    1
      # 3  Sweden    2
      

      可重复的数据(请下次提供):

      lst <- list(
        c('Austria', 'Austria', 'Austria'), 
        c("Austria", "Sweden"), 
        c("Austria", "Austria", "Sweden", "Sweden", "Sweden", "Sweden"), 
        c("Austria", "Austria", "Austria"), 
        c("Austria", "Japan")
      )
      

      【讨论】:

        【解决方案3】:

        这是另一个基本 R 选项

        colSums(
          do.call(
            rbind,
            lapply(
              lst,
              function(x) table(factor(x, levels = unique(unlist(lst)))) > 0
            )
          )
        )
        

        给了

        Austria  Sweden   Japan
              5       2       1
        

        【讨论】:

          【解决方案4】:

          还有一个选项是将stack 放入两列data.frame,然后取unique 并应用table

          table(unique(stack(setNames(lst, seq_along(lst))))$values)
          
          #   Austria   Japan  Sweden 
          #     5       1       2 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-11
            • 2018-07-25
            • 1970-01-01
            • 1970-01-01
            • 2011-01-10
            • 2017-09-29
            • 2019-03-27
            • 1970-01-01
            相关资源
            最近更新 更多