如何使用 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"
我正在尝试使用 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"