Создание таблицы подсчета на основе каждого значения в каждом столбце в R - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть таблица данных, которая начинается так:

    test <- data.frame("AZ" = c("ABCD, AAAA, BBBB"), "AK" = c("ABCD"), "NJ" = c("BBBC", "AAAA"))

Каждый столбец является штатом (Аризона, Аляска, Нью-Джерси), а значения в этих столбцах являются кодами. Если в одной ячейке более одного кода, он будет разделен запятой.

Я хотел бы создать таблицу подсчета, которая показывает, сколько каждого кода отображается для каждого состояния. Таким образом, таблица в итоге будет выглядеть так:

    test2 <- data.frame("ABCD" = c("2", "2", "0"), "AAAA" = c("2", "0", "1"), "BBBB" = c("2", "0", "0"), "BBBC" = c("0", "0", "1"), row.names = c("AZ", "AK", "NJ"))

Есть ли способ получить такую ​​таблицу для вывода в R? Я играл с dplyr, но пока не повезло. Спасибо за вашу помощь:)

1 Ответ

4 голосов
/ 29 апреля 2019

Мы можем gather в «длинный» формат, затем разделить «значение» на разделитель , с помощью separate_rows, получить частоту с count, spread в «широкий» формат

library(tidyverse)
gather(test) %>% 
   separate_rows(value) %>% 
   count(key, value) %>%
   spread(value, n, fill = 0) %>%
   column_to_rownames('key')
#   AAAA ABCD BBBB BBBC
#AK    0    2    0    0
#AZ    2    2    2    0
#NJ    1    0    0    1

ПРИМЕЧАНИЕ. Если нам нужен вывод в «длинном» формате, нет необходимости spread

gather(test) %>% 
    separate_rows(value) %>% 
    count(key, value)
# A tibble: 6 x 3
#  key   value     n
#  <chr> <chr> <int>
#1 AK    ABCD      2
#2 AZ    AAAA      2
#3 AZ    ABCD      2
#4 AZ    BBBB      2
#5 NJ    AAAA      1
#6 NJ    BBBC      1

Обновить

, если нам также нужно сгруппировать по'row', создайте столбец row_number(), затем выполните gather в формате 'long' и count в столбце unite d 'key' и 'rn'

test %>%
   mutate(rn = row_number()) %>% 
   gather(key, val, -rn) %>%
   separate_rows(val) %>% 
   unite(key, key, rn) %>% 
   count(key, val) %>% 
   spread(val, n, fill = 0) %>%
   column_to_rownames('key')
#      AAAA ABCD BBBB BBBC
#AK_1    0    1    0    0
#AK_2    0    1    0    0
#AZ_1    1    1    1    0
#AZ_2    1    1    1    0
#NJ_1    0    0    0    1
#NJ_2    1    0    0    0

или используя base R

table(stack(lapply(test, function(x) unlist(strsplit(as.character(x), ", "))))[2:1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...