【问题标题】:ifelse inside for loop w/ 2 conditionsif else 在 for 循环中带有/ 2个条件
【发布时间】:2018-07-08 10:28:11
【问题描述】:

如果之前有人问过这个问题,我很抱歉。我检查了许多关于在 for 循环中使用 if-else 的问题,但无济于事。我一定是误解了答案。我已经多次编辑我的代码以避免不同的致命错误和/或意外输出(包括没有更改和/或仅评估 else 语句)。

我希望循环做什么: 检查A列是否为负值,B列是否等于2。如果两个条件都为真,则在C列中输入0;否则,将 B 列中的值原样复制到 C 列。 最终,我也想做相反的事情 - 当 A 列为负时,将 0 换成 2。

谢谢!

condition = c(0,1,2)
ppt1 = sample(condition, 124, replace = T) 
ES = rnorm(n = 124)
key = as.data.frame(cbind(ES,ppt1))
key$recoded = rep(NA, 124)

这会创建一个像这样的所需输入:

key[1:6,]
          ES ppt1 recoded
1 -0.1893987    0      NA
2 -0.3840249    2      NA
3  0.7405880    2      NA
4 -1.1683384    0      NA
5  0.6675387    0      NA
6  0.3662369    2      NA

这是我的两次 ifelse 尝试:

for(i in nrow(key)){ 
  ifelse((key$ES[i] < 0) && (key$ppt1[i] == 2),key$recoded[i] == 0,key$recoded[i] == key$ppt1[i]) 
}

for (i in 1:nrow(key)) {
  if(key$ES[i] < 0 && key$ppt1 == 2) {
    key$recoded[i] == 0
  } else {
    key$recoded[i] == "key"
  }
}

期望的结果是这样的:

key[1:6,]
          ES ppt1 recoded
1 -0.9729880    0       2
2  0.5695559    1       1
3  1.1376975    2       2
4  0.8132510    2       2
5  0.8482997    1       1
6 -0.9434207    2       0

看看在第 1 行和第 6 行中,$recoded 列如何交换了 0 和 2。

【问题讨论】:

  • 如果您向reproducible example 提供可用于测试和验证可能解决方案的示例输入和所需输出,则更容易提供帮助。使用随机函数时使用set.seed(),这样我们可以获得与您相同的值。
  • @MrFlick 我添加了一个期望结果的示例。我无法 set.seed 工作。我在运行 ppt1 = sample(condition, 124, replace = T) 之前尝试了 set.seed(5) 并不断得到不同的数字。

标签: r for-loop if-statement


【解决方案1】:

您使用 == 来分配而不是 = 或

而你忘记将 [i] 放入变量 key$ppt1

使用这个

for (i in 1:nrow(key)) {
   if(key$ES[i] < 0 && key$ppt1[i] == 2) {
      key$recoded[i] = "0"
   } else {
      key$recoded[i] = key$ppt1[i]
   }
}

【讨论】:

  • 您还应该提及您所做的 ififelse 更改。
  • @SKOR2 没问题,我们随时为您提供帮助。
【解决方案2】:

ifelse 是矢量化的,因此您不需要 for 循环来使用它。 &amp;&amp;&amp; 的矢量化版本。这应该可以满足您的需求,并且比 for 循环快很多:

key$recoded = ifelse((key$ES < 0) & (key$ppt1 == 2), 0, key$ppt1) 

您可能还喜欢 with 函数,因为它不需要输入您的数据名称。在 with() 中,您可以使用不带 dataframe$ 的列名。

key$recoded = with(key, ifelse(ES < 0 & ppt1 == 2, 0, ppt1))

【讨论】:

  • 呃。我想我看到 ifelse 是这样写的,想知道我是否可以使用它。谢谢。我会切换到这个。我实际上有一个很大的数据框可以使用,所以这可能会有所帮助。
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2023-03-15
  • 2015-08-24
  • 1970-01-01
  • 2017-08-02
相关资源
最近更新 更多