假设我有一个大小为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中有效地实现这一点?
答案 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