【问题标题】:Use for-loop and if function to create a new vector?使用 for-loop 和 if 函数创建一个新向量?
【发布时间】:2021-12-30 08:41:19
【问题描述】:

我想对代码进行以下操作:我想从给定的正态分布中获取一个 n = 30 的样本,并计算每个样本的平均值。 (直到这一步我的功能没有任何问题)。之后,我想创建一个带有 yes 或 no 的新向量,具体取决于平均值是否在某个范围内。遗憾的是,代码没有执行此步骤。我总是得到一个包含 13 个元素的向量,但应该有 500 个。有什么问题?我的错在哪里?

o = 13
u = 7
d = c()
for (i in 1:500){
  i = rnorm(30,mean = 10,sd = 6.04)
  i = mean(i)
  if (i <= o & i >=u) {
    d[i]=("Yes")
  } else {
    d[i]=("No")
  }
}

【问题讨论】:

    标签: r for-loop if-statement vector


    【解决方案1】:

    您应该避免在循环中更改迭代器 (i) 的值。在您的情况下,您的 i 正在成为一个非整数值。当您尝试索引您的d 向量时,它会采用i 的整数部分。

    考虑当我有一个向量时会发生什么

    x <- 1:4
    

    我使用它的pi 索引。

    x[pi]
    # [1] 3
    

    您的代码应该看起来更像这样:

    o = 13
    u = 7
    
    d = c()
    
    for (i in 1:500){
      sample_i = rnorm(30, mean = 10, sd = 6.04)
      mean_i = mean(sample_i)
      if (mean_i <= o & mean_i >=u) {
        d[i]=("Yes")
      } else {
        d[i]=("No")
      }
    }
    

    如果你想改进你的代码,这里有一些建议:

    首先,避免“增长”您的结果。这对性能有影响。最好确定您的结果 (d) 应该有多长,然后将其设置为该长度。

    接下来,尽量不要将迭代次数硬编码到循环中。熟悉 seq_alongseq_len 并使用它们为您计算迭代次数。

    o = 13
    u = 7
    
    d = numeric(500)    #  I made a change here
    
    for (i in seq_along(d)){  # And I made a change here
      sample_i = rnorm(30, mean = 10, sd = 6.04)
      mean_i = mean(sample_i)
      if (mean_i <= o & mean_i >=u) {
        d[i]=("Yes")
      } else {
        d[i]=("No")
      }
    }
    

    【讨论】:

    • 非常感谢您的详细解答。这很有帮助!
    【解决方案2】:

    重新分配 i 对我来说是个坏主意。

    您确定要在 for 循环中执行此操作吗?如果不是,我认为带有交叉的矢量化解决方案(tidyverse - 很好的解释,在 varianceexplained.org 上)应该可以很好地工作?

    o = 13
    u = 7
    
    crossing(trial = 1:500,
             rounds = 1:30)%>%
      mutate(num = rnorm(n(), mean = 10,  sd = 6.04))%>%
      group_by(trial)%>%
      summarise(mean = mean(num))%>%
      mutate(d = case_when(mean <= o & mean >= u ~ "Yes",
                           TRUE ~ "No"))%>%
      count(d)
    
    

    【讨论】:

    • 感谢您的回答。我会看看这种可能性并尝试理解它。
    猜你喜欢
    • 2017-03-20
    • 2022-01-08
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多