R:使用矢量化按间隔设定值

时间:2016-01-19 20:27:17

标签: r

让我们有一个数字向量:

a <- round(runif(20, 1, 5), 0)
[1] 3 5 4 2 1 2 3 4 5 2

我需要使用以下表格为这些数字赋值:

1 to 2: assign "A"
3 to 4: assign "B"
5: assign "C"

这是一个非常简单的样本表,但可能有数千个数字和数十个间隔。

我可以嵌套if if结构来测试每个数字以找到正确的间隔。但我正在寻找更好,更具矢量化的解决方案。如何有效地解决它?

2 个答案:

答案 0 :(得分:2)

a <-  c(3, 5, 4, 2, 1, 2, 3, 4, 5, 2)
cut(a, breaks=c(0.5, 2.5, 4.5, 10), labels=c("A", "B", "C"))

答案 1 :(得分:2)

为要分配类的变量定义最小值和最大值,以及所需的类数,将通过以相等长度的间隔分割变量的范围来定义类:

minValue <- 1
maxValue <- 5
numClasses <- 3

定义中断,这定义了每个间隔的起点和终点:

breaks <- seq(minValue, maxValue, length.out = numClasses+1)
#[1] 1.000000 2.333333 3.666667 5.000000

然后使用函数cut()剪切数字向量,使用整数标签。使用参数include.lowest = TRUE,以便最小值落在第一个间隔中:

set.seed(1)
a <- round(runif(20, 1, 5), 0)
#[1] 2 2 3 5 2 5 5 4 4 1 2 2 4 3 4 3 4 5 3 4
labels = seq(1, length(breaks)-1) #integer labels
classes <- cut(a, breaks=breaks, labels=labels, include.lowest = TRUE)
#[1] 1 1 2 3 1 3 3 3 3 1 1 1 3 2 3 2 3 3 2 3

如果您希望标签为字母,请改为使用以下行:

labels = LETTERS[1:(length(breaks)-1)]
classes <- cut(a, breaks=breaks, labels=labels, include.lowest = TRUE)
#[1] A A B C A C C C C A A A C B C B C C B C

然而,这限制你到26个班级。