Факторы свертывания внутри иерархии

#r #hierarchy #forcats

Вопрос:

Существует ли заранее разработанный способ свернуть факторы внутри иерархии? Я знаю, что могу свернуться вручную. Я знаю, что могу использовать функции fct_lump для автоматического сворачивания моих самых редких факторов. Но если мне это нужно, чтобы «уважать» иерархию, есть ли способ?

В самом простом варианте — если у меня есть фактор с домашними животными и есть 5 уровней: Кошка (9), Собака (10), Кролик (4), Морская свинка (3) и Рыба (2). Если я использую fct_lump_n(3), я бы собрал Морскую свинку и Рыбу вместе. В своих данных я хочу объединить Кролика и морскую свинку либо как «Других млекопитающих», либо как «Родентов». Очевидно, я могу сделать это вручную с помощью fct_collapse. Но есть ли какой-либо способ, добавив остальную часть иерархии в мою структуру данных, чтобы это могло быть автоматическим?

Это грубый пример моих данных:

 require(tidyverse)  myData lt;- tibble (  pet = as_factor(c("dog", "cat", "guinea pig", "rat", "rabbit", "hamster", "mouse", "gerbil", "goldfish", "tropical fish",  "snake", "gecko", "tortoise", "chicken", "budgie", "parrot",   "dog", "cat", "guinea pig", "rabbit", "hamster", "gerbil", "goldfish",   "snake", "gecko", "budgie",   "dog", "cat", "guinea pig", "dog", "dog", "dog", "dog", "cat", "cat", "cat",  "cat", "dog", "cat", "dog", "cat", "dog", "chicken", "rabbit", "rabbit", "hamster") ))  myClassifications lt;- tibble (  pet = as_factor(c("dog", "cat", "guinea pig", "rat", "rabbit", "hamster", "mouse", "gerbil", "goldfish", "tropical fish",  "snake", "gecko", "tortoise", "chicken", "budgie", "parrot")),  class = as_factor(c("mammal", "mammal", "mammal", "mammal", "mammal", "mammal", "mammal", "mammal", "fish", "fish", "reptile", "reptile", "reptile", "bird", "bird", "bird")),  family = as_factor(c("canine", "feline", "rodent","rodent","rodent","rodent","rodent","rodent", "cold water fish", "warm water fish", "legless repitle", "repitle with legs", "reptile with legs", "flightless bird", "flighted bird", "flighted bird")) )  # Add classifcations to my data  myData %gt;%  left_join(myClassifications, by="pet") -gt; myData   

Основной вывод выглядит следующим образом:

 gt; myData %gt;%  group_by(pet) %gt;% #class, family, pet) %gt;%  summarise(n())  
домашнее животное n()
собака 10
кошка 9
морская свинка 3
крыса 1
кролик 4
хомяк 3
мышь 1
gerbil 2
goldfish 2
tropical fish 1
snake 2
gecko 2
tortoise 1
chicken 2
budgie 2
parrot 1

I’d want to try and get to something like:

pet n()
dog 10
cat 9
Rodents 16
Fish 3
Reptiles 5
Birds 5

Я, вероятно, смогу что-то сделать с помощью цикла for, чтобы сделать это. Но если есть пакет или функция, которые могут сделать это за меня, это может дать менее субъективный способ сделать это. По сути, я думаю, что я начинаю с млекопитающих, рептилий и т. Д. И Расширяю уровень, если «достаточно» данных, чтобы быть значимыми… То, как мы определяем значение, конечно, субъективно! В моей таблице выше есть 48 точек данных, и я не стал расширять, если данные были ~ (аналогично fct_lump_prop(0.10) )

Есть ли простое решение?