我有一个带整数的数字向量,它:
到目前为止,我可以使用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]但我不知道如何使用这些值作为采样间隔。
如果有其他的方法,我会有兴趣知道!
发布于 2019-10-02 19:28:56
问得好!我会给你一个完全不同的方法。
因此,基本上您想要执行拉丁超立方体抽样,即在区间[0,100]中与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 99NB:为了方便起见,我做了四舍五入,但如果您愿意将非整数绘图作为输出,则不需要调用round函数)。
https://stackoverflow.com/questions/58206803
复制相似问题