Группировка по нескольким переменным и обобщение частот символов

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

Location    State   County  Job         Pet
            Ohio    Miami   Data        Dog
Urban       Ohio    Miami   Business    Dog, Cat
Urban       Ohio    Miami   Data        Cat
Rural      Kentucky Clark   Data        Cat, Fish
City       Indiana  Shelby  Business    Dog

Сельский Кентукки Собака данных Кларка, Рыба Огайо Майами Дата Собака, Кошка Городской Огайо Майами Деловая собака, Кошка Сельский район Кентукки Кларк Дата Фиш-Сити Индиана Деловой кот Шелби

Я хочу, чтобы мой результат выглядел так:

Location    State   County  Job      Frequency  Pet:Cat Pet:Dog Pet:Fish
            Ohio    Miami   Data        2         1        2       0
 Urban      Ohio    Miami   Business    2         2        2       0
 Urban      Ohio    Miami   Data        1         1        0       0
 Rural    Kentucky  Clark   Data        3         1        1       3
 City     Indiana   Shelby  Business    2         1        1       0

Я пробовал разные итерации следующего кода, и я подошел, но не совсем правильно:

Output<-df%>%group_by(Location, State, County, Job)%>%
  dplyr::summarise(
    Frequency= dplyr::n(),
    Pet:Cat = count(str_match(Pet, "Cat")),
    Pet:Dog = count(str_match(Pet, "Dog")),
    Pet:Fish = count(str_match(Pet, "Fish")),
    )

Любая помощь будет оценена по достоинству! заранее спасибо


person JeffB    schedule 18.12.2020    source источник


Ответы (1)


Попробуй это:

library(dplyr)
library(tidyr)
#Code
new <- df %>% 
  separate_rows(Pet,sep=',') %>%
  mutate(Pet=trimws(Pet)) %>%
  group_by(Location,State,County,Job,Pet) %>%
  summarise(N=n()) %>%
  mutate(Pet=paste0('Pet:',Pet)) %>%
  group_by(Location,State,County,Job,.drop = F) %>%
  mutate(Freq=n()) %>%
  pivot_wider(names_from = Pet,values_from=N,values_fill=0)

Выход:

# A tibble: 5 x 8
# Groups:   Location, State, County, Job [5]
  Location State    County Job       Freq `Pet:Cat` `Pet:Dog` `Pet:Fish`
  <chr>    <chr>    <chr>  <chr>    <int>     <int>     <int>      <int>
1 ""       Ohio     Miami  Data         2         1         2          0
2 "City"   Indiana  Shelby Business     2         1         1          0
3 "Rural"  Kentucky Clark  Data         3         1         1          3
4 "Urban"  Ohio     Miami  Business     2         2         2          0
5 "Urban"  Ohio     Miami  Data         1         1         0          0

Некоторые использованные данные:

#Data
df <- structure(list(Location = c("", "Urban", "Urban", "Rural", "City", 
"Rural", "", "Urban", "Rural", "City"), State = c("Ohio", "Ohio", 
"Ohio", "Kentucky", "Indiana", "Kentucky", "Ohio", "Ohio", "Kentucky", 
"Indiana"), County = c("Miami", "Miami", "Miami", "Clark", "Shelby", 
"Clark", "Miami", "Miami", "Clark", "Shelby"), Job = c("Data", 
"Business", "Data", "Data", "Business", "Data", "Data", "Business", 
"Data", "Business"), Pet = c("Dog", "Dog, Cat", "Cat", "Cat, Fish", 
"Dog", "Dog, Fish", "Dog, Cat", "Dog, Cat", "Fish", "Cat")), row.names = c(NA, 
-10L), class = "data.frame")
person Duck    schedule 18.12.2020
comment
Я получаю эту ошибку: Ошибка: n() следует использовать только внутри глаголов dplyr. - person JeffB; 18.12.2020
comment
Я предполагаю, что функция n () покрывается другим пакетом? - person JeffB; 18.12.2020
comment
@JeffB Некоторые конфликты с другим пакетом. Предложение, перезапустите R, загрузите только упомянутые пакеты и запустите код, используя образцы данных df. - person Duck; 18.12.2020
comment
Это сработало для моих образцов данных, но я получаю это сообщение для своего реального набора данных: Ошибка: проблема с mutate() входом Source. x объект "Источник" не найден i Вход Source - paste0("Source:", Source). i Ошибка произошла в группе 1: Position =, Race =, Gender =. Source был бы эквивалентом Pet в моем фиктивном наборе данных. Спасибо за помощь! - person JeffB; 18.12.2020
comment
@JeffB Похоже, в источнике отсутствуют значения, не могли бы вы проверить unique(yourdata$Source)? - person Duck; 18.12.2020
comment
В этом случае. Можно ли настроить этот код, чтобы игнорировать эти ячейки? - person JeffB; 18.12.2020
comment
@JeffB Да, вы можете добавить фильтр (...), чтобы исключить нужные вам значения, дайте мне знать, если это ясно, или пригласите меня в чат. Рад помочь. - person Duck; 18.12.2020
comment
Не уверен, куда бы добавить этот фильтр. Я пробовал: новый ‹- df%›% filter (! Pets ==)% ›% own_rows (Pet, sep = ',')%›% mutate (Pet = trimws (Pet))% ›% group_by (Location, State , County, Job, Pet)% ›% summarize (N = n ())%›% mutate (Pet = paste0 ('Pet:', Pet))% ›% group_by (Location, State, County, Job, .drop = F)% ›% mutate (Freq = n ())%›% pivot_wider (names_from = Pet, values_from = N, values_fill = 0) Но это вернуло те же результаты. - person JeffB; 18.12.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person JeffB; 18.12.2020