【问题标题】:Re: Randomly selecting values from a matrix, adding for loops (in R) [duplicate]回复:从矩阵中随机选择值,添加 for 循环(在 R 中)[重复]
【发布时间】:2011-08-04 00:18:18
【问题描述】:

可能重复:
Randomly selecting values from an existing matrix after adding a vector (in R)

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

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

代码如下:

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 函数之外一切都正常工作,诚然,我并不完全理解。

【问题讨论】:

  • “后续问题”通常不适合本网站的格式,因为它们会导致本地化解决方案。这尤其是在后续出现与接受的答案存在问题时更是如此。一个只看到你以前的问题的人怎么会知道它没有按你的预期工作?这个网站的一大优点是可以通过提问来帮助别人。
  • 对不起!我应该完全避免发布后续内容吗?我不确定如何将其添加到另一个问题中。
  • 您似乎还有两个名为“Laura”的帐户应该合并在一起:*.com/users/866870/laura*.com/users/874102/laura。我会要求版主通过电子邮件 team@*.com 为您合并它们并让他们知道。
  • 在这种情况下,是的,我会用您的非方阵添加到您的原始问题中,并解释什么不起作用。
  • 我会投票关闭这个,虽然上面的 Q 是很好的跟进,让我看到问题相对容易出现在哪里,但我们需要修复原来的 Q&A。我现在已经做到了。我下面的答案只是保持不变,这样其他人就不会浪费时间试图解决这个问题,直到它关闭。其他人在这里评论也可以帮助关闭吗? TIA

标签: r matrix sampling


【解决方案1】:

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

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

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

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

【讨论】: