1

假设我有一个向量,其中包含代表年龄的 0 到 12(连续)之间的值,以及 2 个分别表示“未回答”和“未回答”的标记值 97 和 99,如下所示:

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

我想将此数值向量转换为因子向量,其中我将 1 到 12 之间的连续值离散化为三个等间隔的 bin(即[1,4), [4, 8), [8,12]),以便最后我有一个具有 5 个级别的因子向量,三个垃圾箱,和 2 为9799。我试图在 R 中找到最好/最有效的方法来做到这一点。

更新

更具体地说,我想要一个函数numeric2factor,它接受一个值vec向量、一个标记向量、由andtokens指定的连续值的范围,以及一个离散化函数。从上面的示例转换为因子向量。startenddiscrFuncnumeric2factorvec = v

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

discrFunc做一些事情,比如返回来自 的连续值的切点(根据一些离散化方法)vec

4

1 回答 1

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
于 2018-11-19T21:23:46.700 回答