代码之家  ›  专栏  ›  技术社区  ›  the_darkside

从列表中统计序列

  •  1
  • the_darkside  · 技术社区  · 6 年前

    我有一个从JSON导入的字符串数组列表。

    data = fromJSON("data.json")
    
    > data
    [[1]]
    [1] "Finish"  "Accept"  "Request"
    
    [[2]]
    [1] "Finish"  "Accept"  "Request"
    
    [[3]]
    [1] "Finish"        "Accept"        "UnlockRequest"
    [4] "Accept"        "Request"      
    
    [[4]]
    [1] "Finish"  "Accept"  "Request"
    
    [[5]]
    [1] "Finish"  "Accept"  "Request"
    

    我现在的目标是统计列表对象,类似于 table() 但是,数据表的功能 table(data) 返回错误:

    误差在 表(数据) :所有参数的长度必须相同

    这里正确的解决方法是什么?

    输出应该如下所示:

    c("Finish", "Accept", "Request") 4
    c("Finish", "Accept", "UnlockRequest", "Accept", 
        "Request") 1
    

    数据:

     list(c("Finish", "Accept", "Request"), c("Finish", "Accept", 
    "Request"), c("Finish", "Accept", "UnlockRequest", "Accept", 
    "Request"), c("Finish", "Accept", "Request"), c("Finish", "Accept", 
    "Request"))
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   bouncyball    6 年前

    请注意这是否“正确”,但这里有一种方法。基本上把它变成 data_frame 使用一个列表列,操作列表列(使用 as.character ,然后计数:

    library(tidyverse)
    
    data_frame(l1) %>%
        mutate(char = as.character(l1)) %>%
        count(char)
    
    # A tibble: 2 x 2
      char                                                                        n
      <chr>                                                                   <int>
    1 "c(\"Finish\", \"Accept\", \"Request\")"                                    4
    2 "c(\"Finish\", \"Accept\", \"UnlockRequest\", \"Accept\", \"Request\")"     1   
    

    另一种方法是 paste 把文字放在一起,跑 table 然后使用 strsplit .

    table(sapply(l1, paste, collapse = ',')) %>% 
        as_data_frame() %>%
        mutate(list_col = strsplit(Var1, ','))
    
    Source: local data frame [2 x 3]
    Groups: <by row>
    
    # A tibble: 2 x 3
      Var1                                           n list_col 
      <chr>                                      <int> <list>   
    1 Finish,Accept,Request                          4 <chr [3]>
    2 Finish,Accept,UnlockRequest,Accept,Request     1 <chr [5]>
    
        2
  •  0
  •   Rich Scriven    6 年前

    你可以跑 as.character() 在你的清单上,然后把结果制成表格。

    as.data.frame(table(as.character(x)))
    #                                                          Var1 Freq
    # 1                            c("Finish", "Accept", "Request")    4
    # 2 c("Finish", "Accept", "UnlockRequest", "Accept", "Request")    1
    

    数据:

    x <- list(c("Finish", "Accept", "Request"), c("Finish", "Accept", 
    "Request"), c("Finish", "Accept", "UnlockRequest", "Accept", 
    "Request"), c("Finish", "Accept", "Request"), c("Finish", "Accept", 
    "Request"))