【问题标题】:How can I use fct_relabel but maintain original factor levels? Or how can I set factor levels in R with partial string matches?如何使用 fct_relabel 但保持原始因子水平?或者如何使用部分字符串匹配在 R 中设置因子级别?
【发布时间】:2021-12-28 17:57:20
【问题描述】:

我正在尝试使用 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)])))

【问题讨论】:

    标签: r factors levels forcats


    【解决方案1】:

    我们可以使用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"
    

    【讨论】:

    • 谢谢!这适用于我上传的练习集,但出于好奇,有没有办法修改代码,使其适用于重复。例如,当我在真实数据集上使用它时,有多个行显示“猫”,但是当我运行它时,它显示“错误:new_levels 的长度必须与levels(f) 相同:预期 3 个新级别,有 5 个。”如果没有,不用担心,因为它回答了我发布的问题。
    • @J.Sabree 对不起,我认为它没有重复。将代码更新为order
    • 别担心,感谢您的帮助!不幸的是,修改也犯了同样的错误。另外,当我阅读代码时,我想确保我理解它是如何工作的——而不是粘贴确切的动物字符串,levels() 让它粘贴它的字符串(连同级别)。然后,n[order(animals),查找特定行的顺序?是对的吗?太巧妙了。
    • @J.Sabree 新代码不应该有同样的错误,因为现在长度是正确的。你能更新一个显示错误的新例子吗
    • @J.Sabree 在文档中,它说.fun - A function to be applied to each level. Must accept one character argument and return a character vector of the same length as its input 关键是它不是应用于整个数据,而是应用于levels。因此,我们必须假设n 列对于“动物”的相应级别也具有相同的值。因此,match 返回第一个匹配的位置索引以提取 n 值以用于pastelevels 返回一个 character 类对象
    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多