【问题标题】:If Loop with several conditionsIf循环有几个条件
【发布时间】:2020-02-03 20:44:57
【问题描述】:

我有以下数据框:

df1
Name      Ch1      Val1
A          a         x1
B          b         x2
C          a         x3
...

我想添加另一行,为我试图获得的循环提供解决方案:

for (i in nrow(df))
  if ( (df[i,3]>=-2)==T & (df3[i,3] <=2)==T & df[i,2]=="a"){
    df[i,4]<-TRUE
  }else if ((df[i,3]>2)==T & df[i,2]=="b"){
    df[i,4]<-TRUE
  }else (df[i,4]<-FALSE)

所以基本上如果 Val1 中的值在 -2 和 +2 的区间内并且 Ch1 是“a”它应该导致 TRUE 或如果 Val1 大于 2 且 Ch1 为“b”,则结果为 TRUE

否则它应该总是错误的。

我的循环似乎只返回第一行的结果,其余为 NA。 知道错误在哪里吗?或者另一种方法来解决这个问题(即使我实际上还有更多的 OR)

谢谢!

【问题讨论】:

  • 一般来说,你永远不需要输入== T&gt;=&lt;== 等逻辑测试已经返回 TRUE 或 FALSE。

标签: r loops if-statement


【解决方案1】:

如果我理解正确,您尝试创建一个新列,其中包含真或假。我会为此使用dplyr

df <- df %>% 
   mutate(new_column = case_when(
 Val1 >=-2  & Val1 <=2 & Ch1 =="a" ~ TRUE,
Val1 > 2 & Ch1 == "b" ~ TRUE,
TRUE ~ FALSE
))

【讨论】:

    【解决方案2】:

    您的 for 循环只进行一次迭代,因为它传递的是单个值而不是序列:i 只采用您指定的单个值,而不是序列中的每个值,例如从 1 到的每个数字nrow(df)。

    例如:

    df <- data.frame(a = 1:5)
    for (i in nrow(df)) {
    print(i)
    }
    

    结果: 5

    但是,

    for (i in 1:nrow(df)) {
    print(i)
    }
    

    结果: 1 2 3 4 5

    但@annet 发布的答案更优雅。

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 2016-02-03
      • 2015-08-24
      • 1970-01-01
      • 2011-10-06
      • 2018-07-08
      • 2014-02-04
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多