如何从填充了1和0的矩阵中取样n个随机点?
a=rep(0:1,5)
b=rep(0,10)
c=rep(1,10)
dataset=matrix(cbind(a,b,c),nrow=10,ncol=3)
dataset
[,1] [,2] [,3]
[1,] 0 0 1
[2,] 1 0 1
[3,] 0 0 1
[4,] 1 0 1
[5,] 0 0 1
[6,] 1 0 1
[7,] 0 0 1
[8,] 1 0 1
[9,] 0 0 1
[10,] 1 0 1
我想确定我的N个样本的位置(行,列)是随机的。
我知道sample {base}
但它似乎不允许我这样做,我知道的其他方法是空间方法会迫使我添加x,y并将其更改为空间对象并再次返回正常的矩阵。
更多信息
随机我的意思是也在“矩阵空间”内扩散,例如,如果我对4个点进行采样,我不希望得到4个相邻点,我希望它们在“矩阵空间”中传播。
知道矩阵中我取出随机点的位置(行,列)也很重要。
答案 0 :(得分:12)
如果您了解R在内部将矩阵表示为向量,则有一种非常简单的方法可以对矩阵进行采样。
这意味着您可以直接在矩阵上使用sample
。例如,假设您想要替换10个点:
n <- 10
replace=TRUE
现在只需在矩阵上使用sample
:
set.seed(1)
sample(dataset, n, replace=replace)
[1] 1 0 0 1 0 1 1 0 0 1
为了演示这是如何工作的,让我们将其分解为两个步骤。第1步是生成采样位置索引,第2步是在矩阵中找到这些位置:
set.seed(1)
mysample <- sample(length(dataset), n, replace=replace)
mysample
[1] 8 12 18 28 7 27 29 20 19 2
dataset[mysample]
[1] 1 0 0 1 0 1 1 0 0 1
而且,嘿presto,这两种方法的结果是相同的。
答案 1 :(得分:4)
样本似乎是最好的选择。要获得1000个随机位置,您可以执行以下操作:
rows = sample(1:nrow(dataset), 1000, replace = TRUE)
columns = sample(1:ncol(dataset), 1000, replace = TRUE)
我认为这给了你想要的东西,但当然我可能会弄错。
从矩阵中提取项目可以像:
random_sample = mapply(function(row, col)
return(dataset[row,col]),
row = rows, col = columns)
在评论中,您说您的样本需要传播。由于其随机性,随机样本没有没有群集的garantuees。还有几个可能有趣的抽样方案:
为了检查您的随机抽样是否产生了良好的结果,我会重复几次随机抽样并比较结果(因为我假设抽样将被输入进行另一次分析?)。