ifelse inside for loop w / 2条件

时间:2018-01-29 16:46:13

标签: r for-loop if-statement

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

我想要循环做什么: 检查A列是否为负值,B列是否为2.如果两个条件都为真,则在C列中加0;否则,将列B中的值原样复制到C列。 最终,当A列为负时,我也想做反向交换0s 2s。

谢谢!

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

以下是我的两次尝试:

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行和第1行的内容。 6,$ recoded列已交换0和2.

2 个答案:

答案 0 :(得分:1)

使用==分配而不是=或&lt; -

你忘了把[i]放在变量键$ 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]
   }
}

答案 1 :(得分:1)

ifelse是矢量化的,因此您不需要for循环来使用它。 &&&的矢量化版本。这应该做你想要的,并且比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))