【问题标题】:Populating matrix with vectors from 'for' loop - producing NAs使用来自“for”循环的向量填充矩阵 - 产生 NA
【发布时间】:2014-12-03 00:03:41
【问题描述】:

我想用我在 for 循环中生成的向量填充矩阵的行。但是,在我运行代码之后,矩阵仍然充满了 NA。

我能够很好地生成向量“l”——它是一个长度为 n (6) 的向量,但我似乎无法用 l 的迭代填充“h”。

非常感谢任何帮助。

p_def = 0.50 
n = 6 
N = 10 
breaks = vector(length = n-1)

for (k in 1:N){
  h <- matrix(nrow=N,ncol=n)
for (i in 1:(n-1)){
  p = runif(1, 0, 1)
  if (p <= p_def){
      breaks[i] = 1
      }
  else {
      breaks[i]=0
      }
  }
temp = 1
j =1 
l = vector(length=n)
for (i in 1:n){
  if (breaks[i] == 1){
    l[j] = temp
    temp = 1
    j = 1 + j
    if (i ==n-1) {
      l[j]=temp}
  }
  if (breaks[i] == 0){
    temp = temp + 1
    if (i==n-1){
      l[j] = temp
      }
    }
}
h[k,] <- l
}
h

在罗德里戈的帮助下,我将脚本编辑为:

p_def = 0.50 # probability of defective
n = 6 # length of spore chains
N = 10 # number of spore chains
breaks = vector(length = n-1)
h <- matrix(nrow=N,ncol=n) 

for (k in 1:N){ 
  for (i in 1:(n-1)){
    p = runif(1, 0, 1)
    if (p <= p_def){
    breaks[i] = 1
  } else {
  breaks[i]=0
  }
}
temp = 1
j =1 
l = vector(length=n)
for (i in breaks){
  if (i == 1){
    l[j] = temp
    temp = 1
    j = 1 + j
    if (i ==n-1) {
      l[j]=temp}
  }
  if ([i == 0){
  temp = temp + 1
  if (i==n-1){
    l[j] = temp
  }
  }
}

h[k,] <- l
}
h
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    2    2    2    0    0    0
 [2,]   NA   NA   NA   NA   NA   NA
 [3,]   NA   NA   NA   NA   NA   NA
 [4,]   NA   NA   NA   NA   NA   NA
 [5,]   NA   NA   NA   NA   NA   NA
 [6,]   NA   NA   NA   NA   NA   NA
 [7,]   NA   NA   NA   NA   NA   NA
 [8,]   NA   NA   NA   NA   NA   NA
 [9,]   NA   NA   NA   NA   NA   NA
[10,]   NA   NA   NA   NA   NA   NA

【问题讨论】:

  • 你在循环中重置了h

标签: r matrix vector


【解决方案1】:

我没有足够的声望来评论你的帖子。可以显示输出的样子吗?

与此同时,我在您的代码中看到了一些错误。

for (k in 1:N){
     h <- matrix(nrow=N,ncol=n)

每次循环启动时,它都会重置您的 h 矩阵。
h &lt;- matrix(nrow=N,ncol=n) 移到循环外 这可能就是为什么你在每一行都有 NA。

此外:

for (i in 1:n){
    if (breaks[i] == 1){
    ...
    }
    if (breaks[i] == 0){
    ...
    }

应该改为:

for(i in breaks){
   if(i == 1){
   ...
   }
   if(i == 0){
   ...

您不能在 breaks length = 5 时运行间隔 n = 6 的循环。
你正在运行一个比向量本身更大的循环...... 这也会生成 NA,因为它不会循环,因为大小不同

当我修复这些点时,我的h 矩阵输出如下所示:

      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    3    0    0    0
 [2,]    1    1    0    0    0    0
 [3,]    1    1    1    1    0    0
 [4,]    2    2    1    0    0    0
 [5,]    2    2    1    0    0    0
 [6,]    4    1    0    0    0    0
 [7,]    4    1    0    0    0    0
 [8,]    1    1    1    0    0    0
 [9,]    3    1    1    0    0    0
[10,]    3    2    0    0    0    0

这就是我所做的:

p_def = 0.50 
n = 6 
N = 10 
breaks = vector(length = n-1)

h <- matrix(nrow=N,ncol=n)

for (k in 1:N){

    for (i in 1:(n-1)){
        p = runif(1, 0, 1)
        if (p <= p_def){
            breaks[i] = 1
        }
        else {
            breaks[i]=0
        }
    }
    temp = 1
    j =1 
    l = vector(length=n)
    for(i in breaks){
        if(i == 1){
            l[j] = temp
            temp = 1
            j = 1 + j
            if (i == n-1) {
                l[j]=temp}
        }
        if(i == 0){
            temp = temp + 1
            if (i==n-1){
                l[j] = temp
            }
        }
    }
    h[k,] <- l
}
h

【讨论】:

  • 嗨罗德里戈,感谢您的快速回复!这正是我想要的输出。通过您的更正,我能够正确填写第 1 行,但它似乎并没有遍历 i:N 的所有 k。
  • 那里还有一个错误f ([i == 0){ 应该是f (i == 0){。复制我做的修复,看看它是否适合你
  • 谢谢罗德里戈!效果很好。
  • 很高兴能帮上忙 :D
猜你喜欢
  • 2019-05-27
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多