【问题标题】:Using forcats with data that has possible levels not present in data对数据中不存在可能级别的数据使用 forcat
【发布时间】:2020-09-05 21:04:31
【问题描述】:

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

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

如果我将其表化,我会看到 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 中是否有任何方法可以处理理论上存在但当时不一定存在于数据中的关卡?

【问题讨论】:

    标签: r forcats


    【解决方案1】:

    如果我们想用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

    【讨论】:

    • 效果很好!请参阅下面的解决方案,我已在其中实施了您的建议。如果您有任何其他改进,请告诉我。谢谢!
    【解决方案2】:

    根据@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()
    

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 2013-12-26
      • 1970-01-01
      • 2020-04-11
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多