我的数据在理论上是可能的,但在数据中不存在。我可以很容易地用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中是否有任何方法来处理理论上存在但在当时的数据中不一定存在的水平?
发布于 2020-09-05 21:10:42
如果我们想在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扩展factor或character的levels (转换为factor)。
发布于 2020-09-05 21:23:17
根据“阿克伦”的建议,我已经完成了我想要做的事情。见下面的例子:
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()https://stackoverflow.com/questions/63758501
复制相似问题