我试图在R中的数字变量中创建一个因子变量。我想跟踪NA&s以及我正在创建的新箱子。在新的箱子中,有些数字是有效的范围,有些则不是。我关心自己的垃圾箱,但想要创造一个"无效的"容纳任何不属于指定范围的东西。
以下是一个例子:
library(reshape)
fac <- c(-1, 1, 2, 3, 4, 100, NA)
fac <- cut(fac, c(-Inf, 1, 2, 3, Inf))
fac <- addNA(fac)
combine_factor(fac,
variable=order(levels(fac))[c(2,3,5)],
other.label = "Invalid")
这会给我一些输出,这些输出的级别我想成为间隔,NA或无效。
然而,我遇到的麻烦是我不想使用数字对变量进行编码,因为我有多个不同的数据集,而不是所有数据集都包含每个级别的因子。
如果我更改变量,使其不包含任何特定级别的因子:
fac <- c(-1, 1, 3, 4, 100, NA)
我一直收到错误:
因子误差(nvar [as.numeric(fac)],labels = c(levels(fac)[variable], :无效&#39;标签&#39 ;;长度4应为1或3。
输出1(这是因为我没有出现0次的等级):
[1] (1,2] (1,2] (2,3] <NA> Invalid Invalid Invalid
Levels: (1,2] (2,3] <NA> Invalid
输出2(其中一个级别:(1,2)出现0次):
[1] (2,3] <NA> Invalid Invalid Invalid
Levels: (1,2] (2,3] <NA> Invalid
第二种情况是我遇到错误。
有什么办法可以解决这个错误吗?
答案 0 :(得分:2)
我对combine_factor
函数了解不多,但编写自己的函数似乎很容易....
这是一个基本的例子:
NewLevs <- function(fac, keep, others = "Invalid") {
lf <- levels(fac)
nl <- c(setNames(as.list(lf[keep]), lf[keep]),
setNames(as.list(lf[-keep]), rep(others, length(lf)-length(keep))))
levels(fac) <- nl
fac
}
以下是一些示例数据:
fac1 <- c(-1, 1, 2, 3, 4, 100, NA)
fac1 <- addNA(cut(fac1, c(-Inf, 1, 2, 3, Inf)))
fac2 <- c(-1, 1, 3, 4, 100, NA)
fac2 <- addNA(cut(fac2, c(-Inf, 1, 2, 3, Inf)))
使该功能起作用:
fac1
# [1] (-Inf,1] (-Inf,1] (1,2] (2,3] (3, Inf] (3, Inf] <NA>
# Levels: (-Inf,1] (1,2] (2,3] (3, Inf] <NA>
NewLevs(fac1, c(2, 3, 5))
# [1] Invalid Invalid (1,2] (2,3] Invalid Invalid <NA>
# Levels: (1,2] (2,3] <NA> Invalid
fac2
# [1] (-Inf,1] (-Inf,1] (2,3] (3, Inf] (3, Inf] <NA>
# Levels: (-Inf,1] (1,2] (2,3] (3, Inf] <NA>
NewLevs(fac2, c(2, 3, 5))
# [1] Invalid Invalid (2,3] Invalid Invalid <NA>
# Levels: (1,2] (2,3] <NA> Invalid
可以更改所需级别加上不需要级别的标签:
NewLevs(fac2, c(1, 2, 3), "Wrong")
# [1] (-Inf,1] (-Inf,1] (2,3] Wrong Wrong Wrong
# Levels: (-Inf,1] (1,2] (2,3] Wrong