Подсчет последовательностей из списка - PullRequest
0 голосов
/ 09 января 2019

У меня есть список строковых массивов, импортированных из 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"))

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете запустить 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"))
0 голосов
/ 09 января 2019

Обратите внимание, если это "правильно", но вот один из способов. По сути, превратить его в 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]>
...