【问题标题】:Tallying sequences from a list从列表中计算序列
【发布时间】:2019-01-09 16:09:03
【问题描述】:

我有一个从 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)返回错误:

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"))

【问题讨论】:

    标签: r list dplyr plyr


    【解决方案1】:

    请注意这是否“正确”,但这是一种方法。基本上把它变成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]>
    

    【讨论】:

    • 我收到Error in count(., char) : object 'char' not found
    • 您是否将列表存储为l1,或者您是否编辑了该部分以反映您的环境中的情况?
    【解决方案2】:

    您可以在列表中运行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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多