суммирование списка векторов символов с использованием forcats и purrr - PullRequest
1 голос
/ 24 января 2020

У меня есть тиббл, где col1 - это список векторов символов переменной длины, а col2 - это вектор чисел c, обозначающий групповое назначение, либо 1, либо 0. Я хочу сначала преобразовать все векторы символов. в списке (col1) к факторам, а затем объедините все уровни факторов по всем этим факторам, чтобы в итоге я смог получить подсчет количества для каждого уровня фактора. Для приведенных ниже примеров данных это будет означать, что подсчет будет следующим:

в целом:

    level, count  
    "a", 2
    "b", 2
    "c", 2
    "d", 3
    "e", 1

для группы = 1:

    level, count  
    "a", 1
    "b", 2
    "c", 1
    "d", 1
    "e", 0

для группы = 0:

    level, count  
    "a", 1
    "b", 0
    "c", 1
    "d", 2
    "e", 1

Конечная цель состоит в том, чтобы иметь возможность получить общее количество каждого факторного уровня c("a","b","c","d","e") и построить их по переменной группировки.

Вот некоторый код, который мог бы улучшить контекст моей проблемы:

library(forcats)
library(purrr)
library(dplyr)
library(ggplot2)

tib <- tibble(col1=list(c("a","b"),
                 c("b","c","d"), 
                 c("a","d","e"),
                 c("c","d")),
       col2=c(1,1,0,0))


tib %>% 
  mutate(col3=map(.$col1,.f = as_factor)) %>% 
  mutate(col4=map(.$col3,.f = fct_unify))

К сожалению, этот код не работает. Я получаю следующую ошибку, но не знаю почему:

Error: fs must be a list

Я думал, что мой ввод был списком?

Я ценю любую помощь кто-нибудь может предложить. Спасибо.

1 Ответ

1 голос
/ 24 января 2020

Вы можете сначала unnest, а затем count

library(dplyr)
library(tidyr)

tib %>%
  unnest(col = col1) %>%
  #If needed col1 as factors
  #mutate(col1 =factor(col1)) %>%
  count(col1)

#  col1      n
#  <fct> <int>
#1 a         2
#2 b         2
#3 c         2
#4 d         3
#5 e         1

К count на основе группы, т.е. col2, мы можем сделать

tib %>% 
  unnest(col = col1) %>% 
  mutate_at(vars(col1, col2), factor) %>%
  count(col1, col2, .drop = FALSE)

#   col1  col2      n
#   <fct> <fct> <int>
# 1 a     0         1
# 2 a     1         1
# 3 b     0         0
# 4 b     1         2
# 5 c     0         1
# 6 c     1         1
# 7 d     0         2
# 8 d     1         1
# 9 e     0         1
#10 e     1         0
...