比方说,我有一个向量,该向量包含表示年龄的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,两个为97
和99
。我正在尝试在R中找到最佳/最有效的方法来完成此任务。
更新
更具体地说,我想要一个函数numeric2factor
,该函数接受值vec
的向量,令牌tokens
的向量,由以下项指定的连续值的范围start
和end
,以及离散函数discrFunc
。 numeric2factor
将以上示例中的vec = v
转换为因子向量。
假设end
小于最低标记值(例如end=12
,最低标记值约为97),因此连续值和分类值之间没有重叠。>
discrFunc
的作用类似于返回vec
中连续值的切点(根据某种离散化方法)。
答案 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