将 forcats 与数据中不存在的可能级别的数据一起使用

Using forcats with data that has possible levels not present in data

我的数据具有理论上可能但数据中不存在的水平。我可以很容易地在 base R:

中表示
factor(c("test","test1","test2"), levels = c("test","test1","test2","test3"))

如果我 table 它,我看到 test3 是 0。这很好,并且允许我编写函数,假设这些级别包括所有可能的结果,以防数据最终添加了包含此级别的内容。

我无法在 forcats 中复制它。首先,as_factor 函数不接受任何附加参数:

forcats::as_factor(c("test","test1","test2"), levels = c("test","test1","test2","test3"))

以上会产生错误。

以下内容带有警告(如果可能的话,我希望在没有警告的情况下完成我的目标):

forcats::as_factor(c("test","test1","test2")) %>% forcats::fct_recode(`test` = "test", `tests` = "test1", `tests` = "test2", `tests` = "test3")

Warning message:
Unknown levels in `f`: test3 

forcats 中有没有什么方法可以玩理论上存在但当时不一定在数据中的级别?

如果我们想用 factor 复制相同的行为,可以使用 fct_expand

c("test","test1","test2") %>%
       forcats::fct_expand(c("test","test1","test2","test3"))
#[1] test  test1 test2
#Levels: test test1 test2 test3

关于...的使用(as_factor中的其他参数),实际上并没有使用

library(forcats)
methods(as_factor)
#[1] as_factor.character* as_factor.factor*    as_factor.logical*   as_factor.numeric*  

现在,我们检查as_factor.character

的代码
getAnywhere(as_factor.character)
function (x, ...) 
{
    structure(fct_inorder(x), label = attr(x, "label", exact = TRUE))
}

fct_inorder 只接受 'x' 而不是通过 ...

传入的任何其他参数

这里,我们可以直接用fct_expand展开factorcharacterlevels(转为factor

根据@Akrun 的建议,我已经完成了我想做的事情。请参阅下面的示例:

test <- c("fruit","fruit","apple","drink","meat")
levels <- c(
  `Fruit` = "fruit",
  `Fruit` = "apple",
  `Drink` = "drink",
  `Vegetable` = "vegetable",
  `Meat` = "meat"
)

factor(test) %>% table()
factor(test) %>% forcats::fct_expand(levels) %>% table()
factor(test) %>% forcats::fct_expand(levels) %>% forcats::fct_recode(!!!levels) %>% table()