【问题标题】:Logical comparison of two vectors with binary (0/1) result两个向量与二进制 (0/1) 结果的逻辑比较
【发布时间】:2014-10-13 17:35:39
【问题描述】:

对于一个作业,我必须创建一个随机向量 theta,一个包含每个 theta 元素相关概率的向量 p,以及另一个随机向量 u。到目前为止没有问题,但我坚持我在下面报告的下一条指令:

生成一个向量 r1,如果 pi ≥ ui,则在位置 i 处为 1,如果 pi

theta=rnorm(1000,0,1)
p=(exp(theta-1))/(1+exp(theta-1))
u=runif(1000,0,1)

我尝试了以下代码,但它不起作用。

r1<-for(i in 1:1000){
if(p[i]<u[i]){
  return("0")
} else {
  return("1")}
}

【问题讨论】:

    标签: r vector


    【解决方案1】:

    你可以使用ifelse函数:

    r1 <- ifelse(p >= u, 1, 0)
    

    或者您可以简单地将逻辑比较转换为数值向量,将TRUE 转换为 1,FALSE 转换为 0:

    r1 <- as.numeric(p >= u)
    

    【讨论】:

      【解决方案2】:

      @DavidRobinson 提供了一个不错的解决方案,但让我们看看为什么您的尝试没有成功:

      r1<-for(i in 1:1000){
      if(p[i]<u[i]){
        return("0")
      } else {
        return("1")}
      }
      

      我们遇到了一些问题,其中最大的问题是您通过分配和使用return()for 循环与一般函数混淆了。 return() 用于编写自己的函数时使用function() &lt;- ...。在 for 循环内不需要它。 for 循环只是运行其中的代码一定次数,它不能返回类似函数的东西。

      确实需要一种方法来存储您的结果。最好预先分配一个结果向量,然后将其填充到for 循环中。

      r1 <- rep(NA, length(p)) # create a vector as long as p
      for (i in 1:1000) {
          if (p[i] < u[i]) {   # compare the ith element of p and u
              r1[i] <- 0       # put the answer in the ith element of r1
          } else {
              r1[i] <- 1
          }
      }
      

      我们可以稍微简化一下。而不是打扰if else,您可以将r1作为全0开始,然后仅在p[i] &gt;= u[i]时将其更改为1。为了安全起见,我认为最好将 for 语句设置为 for (i in 1:length(p)) 或最好的 for (i in seq_along(p)),但 R 的美妙之处在于需要很少的 for 循环,而且 @DavidRobinson 的矢量化建议要干净得多。

      【讨论】:

        猜你喜欢
        • 2016-06-29
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2015-09-02
        • 2023-03-31
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        相关资源
        最近更新 更多