我有一个带有整数的数字矢量,其中:
到目前为止,我都可以使用findInterval
来做,但是我正在寻找一种使用cut
的方法。
让我们考虑一个带有整数的随机向量,该向量将以相等大小的长度2
的间隔进行分割:
df = sample(1:100,10)
df
[1] 81 11 38 95 45 14 10 61 96 88
使用findInterval
,我得到了垃圾箱和大概的采样方式:
breaks = seq(1,max(df+1),by=10)
b <- findInterval(df, breaks)
b
[1] 9 2 4 10 5 2 1 7 10 9
# If b is equal to 1 or 100, then use ifelse() to prevent leaking outside [1,100]
sam <- round(runif(10,ifelse(b==1,10*b-9,10*b-10),ifelse(b==10,10*b,10*b+10)))
sam
[1] 85 14 39 94 50 16 7 63 93 85
使用cut
,我得到了间隔:
breaks = seq(1,max(df+1),by=10)
cut(df,breaks,right=TRUE)
[1] (71,81] (1,11] (31,41] <NA> (41,51] (11,21] (1,11] (51,61] <NA> (81,91] Levels: (1,11] (11,21] (21,31] (31,41] (41,51] (51,61] (61,71] (71,81] (81,91]
但是我不知道如何使用这些值作为采样间隔。
如果有其他方法,我想知道!
好问题!我会给你一种完全不同的方法。
因此,基本上,您要执行Latin Hypercube采样,即对[0,100]
的每个bin在间隔10
中进行分层均匀采样。
为此,下载lhs
软件包并使用randomLHS
功能执行分层采样会更容易。
[第一步:根据需要,每10个四分位数(层)生成均匀绘制。在此示例中,让我们做5次:
library(lhs)
randomLHS(10, 5)
> X
[,1] [,2] [,3] [,4] [,5]
[1,] 0.92154144 0.22185959 0.49953326 0.66248165 0.79035832
[2,] 0.47571700 0.05894016 0.55883326 0.34875162 0.98831829
[3,] 0.57738486 0.64525528 0.04955733 0.50939147 0.46297294
[4,] 0.17578838 0.83843074 0.27138703 0.87421301 0.16401042
[5,] 0.03850768 0.40746004 0.69518073 0.23487653 0.55537945
[6,] 0.83942905 0.52957416 0.84952231 0.14031915 0.84956654
[7,] 0.22802502 0.79911728 0.76789194 0.09788194 0.08667802
[8,] 0.61821268 0.93088726 0.30789950 0.95831993 0.36903120
[9,] 0.70391230 0.11445154 0.97976851 0.42027836 0.61097786
[10,] 0.31385709 0.33557430 0.18389684 0.70124986 0.27601550
[第二步骤] >>:尽管X
的输出已分层,但这些列仍未排序。因此,当我们显示最终的分层抽奖时,将对其进行排序。
:为了方便起见,我进行了四舍五入,但如果希望将非整数绘制作为输出,则无需调用Y <- apply(X,2, function(x) sort(round(x*100))) > Y [,1] [,2] [,3] [,4] [,5] [1,] 4 6 5 10 9 [2,] 18 11 18 14 16 [3,] 23 22 27 23 28 [4,] 31 34 31 35 37 [5,] 48 41 50 42 46 [6,] 58 53 56 51 56 [7,] 62 65 70 66 61 [8,] 70 80 77 70 79 [9,] 84 84 85 87 85 [10,] 92 93 98 96 99
NB
round
函数。]