2

可能重复:
在添加向量后从现有矩阵中随机选择值(在 R 中)

这是我上周提出的问题的后续,可以在这里找到。我不确定是否适合在同一个地方发布这个问题,或者将它作为一个新问题发布。

好的,上次我询问了在将新向量绑定到矩阵后从矩阵中随机删除值的问题。答案非常有用,但是我在使用非方阵时发现了一个错误。我一直在循环运行代码并每次取矩阵的总和以确保它正常工作,但我发现总和会有所不同,这意味着代码有时会在矩阵中选择错误的值(我希望它只选择和替换那些)。

这是代码:

mat1<-matrix(c(1,0,1,0, 0,1,1,1, 1,0,0,0, 1,0,0,1, 1,1,1,1, 0,0,0,1),byrow=F, nrow=4)
I.vec<-c(0,1,1,1,0,0)


foo <- function(mat, vec) {
nr <- nrow(mat)
nc <- ncol(mat)
cols <- which(vec == 1L)
rows <- sapply(seq_along(cols), 
    function(x, mat, cols) {
        ones <- which(mat[,cols[x]] == 1L)
        sample(ones, 1)
        }, mat = mat, cols = cols)
ind <- (nr*(cols-1)) + rows
mat[ind] <- 0
mat <- rbind(mat, vec)
rownames(mat) <- NULL
mat
}

set.seed(2)

for (j in 1:1000){                             #run this vector through the simulations
     I.vec2=sample(I.vec,replace=FALSE)       #randomize interactions
     temp=foo(mat1,I.vec2)                    #run foo function
     prop=sum(temp)
     print.table(prop)
     }

在这种情况下,有时矩阵的和是 13,有时是 14,而它应该始终是 = sum(mat1) = 13。

我试图分解代码,我认为除了 rows 函数之外一切都正常工作,诚然,我并不完全理解。

4

1 回答 1

1

问题是sample(). 我将更新原始 Q,但问题是由于1在候选矩阵的列中观察到一个。生成的代码rows试图从一组 1 中采样。不幸的是,我忘记了它sample()有一个特性,当第一个参数是长度为 1 的向量时,sample()将其视为您想从集合中采样1,...,您真正想要从中采样的集合中单个元素的值在n哪里。n

一个简单的示例说明了当参数xtosample()是长度为 1 的向量时的行为:

> set.seed(1)
> replicate(10, sample(4, 1))
 [1] 2 2 3 4 1 4 4 3 3 1

本能地,这些都应该是4,但它们并不是因为这个记录在案且众所周知的功能。

于 2011-08-04T00:56:06.483 回答