将 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
展开factor
或character
的levels
(转为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()
我的数据具有理论上可能但数据中不存在的水平。我可以很容易地在 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
展开factor
或character
的levels
(转为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()