检查向量R中的所有值的区间

时间:2017-02-27 22:29:27

标签: r vector

假设我有一个大小为915的向量。向量的名称是base

[1] 1.467352 4.651796 4.949438 5.625817 5.691591 5.839439 5.927564 7.152487 8.195661 8.640770....591.3779 591.9426 592.0126 592.3861 593.2927 593.3991 593.6104 594.1526 594.5325 594.7093

我还构建了另一个向量: intervals <- c(0,seq(from = 1, by = 6,length.out = 100))我们可以将此向量解释为区间。

然后我想测试向量interval的每个值位于哪个区间(向量base)。例如,base的第一个元素位于第二个区间(1.467352不会位于区间(0,1]中,而是位于(1,7])中。我想为base

中的每个值执行相同的过程

由此我想创建第三个向量,这意味着base的第i个元素的区间数

BUT!每个间隔的最大大小例如是5(一个间隔只能由五个元素组成)。这意味着,即使向量base的七个元素位于第二个区间,第二个区间必须仅包含五个。

third_vector = 2,2,2,2,2,3,3....

如我们所见,第二个区间中只有五个元素。由于缺乏空间,第6和第7个元素必须位于第三个区间。

问题是:如何在R中有效地实现这一点?

1 个答案:

答案 0 :(得分:2)

一种选择是将数据分组为分位数,其中分位数的数量是根据给定间隔中允许的最大值数设置的。以下是一个例子。如果这是您的想法,请告诉我:

# Fake data
set.seed(1)
dat = data.frame(x=rnorm(83, 10, 5))

# Cut into intervals containing no more than n values
n = 5
dat$x.bin = cut(dat$x, quantile(dat$x, seq(0,1,length=ceiling(nrow(dat)/n)+1)), 
                include.lowest=TRUE)

# Check
table(dat$x.bin)
[-1.07,3.62]  (3.62,5.87]   (5.87,6.7]   (6.7,7.29]   (7.29,8.2]   (8.2,9.32]  (9.32,9.72] 
           5            5            5            5            5            4            5 
 (9.72,9.97]  (9.97,10.8]  (10.8,11.7]  (11.7,12.1]  (12.1,12.9]  (12.9,13.5]    (13.5,14] 
           5            5            5            5            4            5            5 
   (14,15.5]  (15.5,17.4]    (17.4,22] 
           5            5            5

要实施@ LorenzoBusetto的建议,您可以执行以下操作。此方法可确保除最后一个时间间隔之外的每个时间间隔都包含n值:

dat = dat[order(dat$x),]
dat$x.bin = 0:(nrow(dat)-1) %/% n