【问题标题】:How to combine a 'for' loop with an 'if' statement?如何将“for”循环与“if”语句结合起来?
【发布时间】:2021-09-18 00:15:04
【问题描述】:

我是新手,我的问题可能是你们中许多人能想象到的最简单的问题。尽管如此,我还是被困住了,并且一直在到处寻找答案,所以请帮忙。我正在编写一个简单的循环,由一个“for”和一个“if”语句组成,评估一个简单的向量。我不断得到错误的结果,我不知道问题出在哪里。代码如下:

Y <- c(3,5,2,7)  
for (n in Y) {
if (n < 6) (Y[n]=0)
}

评估时,结果是:3 0 0 7 0,这不是我所期望的!该代码应该评估 Y 中的每个项目,如果它小于 6,则返回 0。所以它应该是:0 0 0 7。我做错了什么?请帮忙!

【问题讨论】:

  • 请标记您的编程语言。
  • 这个简单的操作为什么要循环和 if else。这样做Y[Y &lt;6] = 0

标签: r loops for-loop if-statement


【解决方案1】:

当您执行for (n in Y) 时,实际上是在迭代数组的元素,因此当您尝试更改 Y 的值时,您并没有传递索引,而是传递了值。

你需要做这样的事情(不知道你用的是哪种语言):

Y <- c(3,5,2,7)  
for (n in 1:length(Y)) {
  if (Y[n] < 6) (Y[n]=0)
}

使用您的原始代码发生的事情是:

if (3 < 6) (Y[3]=0) --it changes position 3
if (5 < 6) (Y[5]=0) --it adds a 0 to position 5
if (2 < 6) (Y[2]=0) --it changes position 2
if (7 < 6) (Y[7]=0) --nothing happens

【讨论】:

  • 它是用 R 写的!
  • 非常感谢!出于好奇:当我输入原始代码时到底发生了什么?为什么会出现这个奇怪的结果:3 0 0 7 0?
  • @adalbehrt 你用自己的内容索引Y,所以这相当于Y[3] = 0; Y[5] = 0; Y[2] = 0Y[1]Y[4] 保持不变。
  • if (3 &lt; 6) (Y[3]=0) --it changes position 3 if (5 &lt; 6) (Y[5]=0) --it adds a 0 to position 5 if (2 &lt; 6) (Y[2]=0) --it changes position 2 if(7 &lt; 6) (Y[7]=0) --nothing happens
【解决方案2】:

由于 R 是一种矢量化语言,所以很少需要 for 循环,尤其是对于基本操作。熟悉 R 的向量特征可以节省大量的打字(和头痛)。因此,为了替换 Y 中小于 6 的所有值,我们可以编写

Y[Y < 6] <- 0
Y

[1] 0 0 0 7

这里,Y &lt; 6 返回满足条件的Y 元素的逻辑向量

[1] 真真真假

然后将其用于子集。


此外,R 有 replace() 函数,同样可以使用:

replace(Y, Y < 6, 0)
[1] 0 0 0 7

【讨论】:

  • 即使这不能回答问题,对于 R 开发人员来说,对于 OP 试图解决的问题来说,这是一个更好的解决方案。
猜你喜欢
  • 2018-03-27
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2017-08-06
  • 2017-10-29
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多