使用cut()来制作因子

时间:2015-12-18 19:34:16

标签: r cut

我试图在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

第二种情况是我遇到错误。

有什么办法可以解决这个错误吗?

1 个答案:

答案 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