将具有连续和分类值的向量转换为因子向量

时间:2018-11-19 20:31:11

标签: r

比方说,我有一个向量,该向量包含表示年龄的0到12(连续)之间的值,以及2个令牌值97和99,分别表示“不回答”和“缺失”,所以类似:

v <- sample(c(sample(1:12, 95, replace = TRUE), 99, 99, 97, 99, 99))

我想将此数值向量转换为因子向量,在这里我将1到12之间的连续值离散化为三个相等间隔的区间(即[1,4), [4, 8), [8,12]),以便最终得到一个向量具有5个级别的因子,三个为bin,两个为9799。我正在尝试在R中找到最佳/最有效的方法来完成此任务。

更新

更具体地说,我想要一个函数numeric2factor,该函数接受值vec的向量,令牌tokens的向量,由以下项指定的连续值的范围startend,以及离散函数discrFuncnumeric2factor将以上示例中的vec = v转换为因子向量。

假设end小于最低标记值(例如end=12,最低标记值约为97),因此连续值和分类值之间没有重叠。

discrFunc的作用类似于返回vec中连续值的切点(根据某种离散化方法)。

1 个答案:

答案 0 :(得分:0)

这是开始,可能需要适应您的特定需求:

set.seed(1);v <- sample(c(sample(1:12, 95, replace = TRUE), 99, 99, 97, 99, 99))
table(v)
# 1  2  3  4  5  6  7  8  9 10 11 12 97 99 
# 5  6  9  7 13 10  4  8  8 11 10  4  1  4 

numeric2factor <- function(x, start, end, bins){
  res <- character(length = length(x))
  ix1 <- x >= start & x <= end
  res[ ix1 ] <- as.character(cut(x[ ix1 ], seq(min(x[ ix1 ]) - 1, max(x[ ix1 ]),
                                               length.out = bins + 1)))
  res[ !ix1 ] <- x[ !ix1 ]
  as.factor(res)

}

table(numeric2factor(v, min(v), 12, 3))
# (0,4]  (4,8] (8,12]     97     99 
#    27     35     33      1      4