如何使用 fct_relabel 但保持原始因子水平?或者如何使用部分字符串匹配在 R 中设置因子级别?

How can I use fct_relabel but maintain original factor levels? Or how can I set factor levels in R with partial string matches?

我正在尝试使用 forcats 中的 fct_relabel() 来重新标记我的因子以包括因子名称和与其对应的行数,但是当我使用该函数时,它完全改变了我设置的列显示顺序的级别。我怎样才能覆盖这个?我的原始名称是一致的(例如,动物名称),但计数会有所不同。因此,我不能依靠通过新标签名称手动重新调平,除非我可以以某种方式进行部分匹配(例如,标签名称不完全匹配但包含 cat)。

如有任何帮助,我们将不胜感激!

library(dplyr)
library(forcats)

test <- tibble(animal = factor(c("cat", "dog", "pig"), levels = c("dog", "pig", "cat")),
               n = c(100, 10, 5),
               animal_num = fct_relabel(animal, ~paste(animal, "N =", n)))

levels(test$animal) #original, correct levels
levels(test$animal_num) #levels should be "dog N = 10", "pig N = 5", "cat N = 100"

我也不想使用 fct_relabel,但我会优先考虑 tidyverse 解决方案。谢谢!

使用具有重复值的示例进行更新

test <- tibble(animal = factor(c("cat", "dog", "pig", "cat", "dog"),
                               levels = c("dog", "pig", "cat")),
               n = c(100, 10, 5, 100, 10),
               animal_num = fct_relabel(animal, ~ paste(animal[order(animal)],
                                                        "N=", n[order(animal)])))

我们可以使用levels

test <- tibble(animal = factor(c("cat", "dog", "pig"),
             levels = c("dog", "pig", "cat")),
               n = c(100, 10, 5),
       animal_num = fct_relabel(animal, 
     ~ paste(levels(animal), "N=", n[match(levels(animal), animal)])))

-输出

> levels(test$animal)
[1] "dog" "pig" "cat"
> levels(test$animal_num)
[1] "dog N= 10"  "pig N= 5"   "cat N= 100"