【问题标题】:For-Loop in R with if-else: How to save the output带有 if-else 的 R 中的 For-Loop:如何保存输出
【发布时间】:2018-08-15 09:28:17
【问题描述】:

我正在尝试保存下面代码的输出。我知道“打印”是问题所在,但我不知道用什么代替。

我通常想知道是否没有其他方法可以代替for循环:对于向量(x)中的每个值,我想绘制一个新的随机数(这里使用runif)并将其匹配到给定的值(例如0.5)。根据结果​​,x 的新值应存储在向量 x2 中(类似于下面的 if-else 示例)。放弃 for 循环,我找不到一种方法来总是为向量 x 中的每个值绘制一个新的随机数。 如果有任何帮助,我将不胜感激!

x <- c(2,2,2,3,3,3)

for(i in x){
  if(runif(1) <= 0.5){
    print(i + 1)
  } else {
    print(i)
  }
}

【问题讨论】:

  • x2 &lt;- ifelse(runif(length(x)) &lt;= 0.5, x + 1, x) 不做你想做的事吗?我认为这里不需要循环。
  • 感谢您的回答!但问题就在这里:这样,只生成一个随机数并与向量 x 中的值进行比较。我想为每个值绘制一个新数字。
  • runif(length(x)) 生成一个随机数向量,x 中的每个元素一个,而不是一个。
  • @MikkoMarttila,再次感谢,现在它可以工作了!你说得对,似乎不需要循环。

标签: r for-loop if-statement


【解决方案1】:

或者您可以使用lapply,那么您不必在每一步都修改循环之外的对象。

x <- c(2,2,2,3,3,3)

x2 <- unlist(lapply(x, function(x){
          if(runif(1) <= 0.5) return(x +1)
          return(x)
}))

x2

【讨论】:

  • 谢谢@trosendal!但它必须是“return(x+1)”和“return(x)”而不是“i”,对吧?
【解决方案2】:

试试这个代码:

x <- c(2,2,2,3,3,3)
x2<-NULL

for(i in 1:length(x)){
   if(runif(1) <= 0.5){
     x2[i]<-1
   } else {
     x2[i]<-2
   }
 }

你的输出

x2
[1] 1 2 2 1 2 1

x2 中,您有与runif 概率相关的具有给定值(1 和2)的随机数。

这是同一行:

ifelse(runif(n = length(x))<=0.5,1,2)
[1] 1 2 2 2 1 1

【讨论】:

  • 非常感谢,这正是我要找的。在一行中使用 ifelse 似乎是最有效的。
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2021-06-15
  • 2018-05-17
  • 2018-04-16
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多