【问题标题】:Applying conditional statements to all elements in a dataframe using R使用 R 将条件语句应用于数据框中的所有元素
【发布时间】:2014-02-08 23:10:24
【问题描述】:

我有一个看起来像这样的数据框-

> dpd
         md       mean         sd       fsf        dii   n
2      77.5 0.02827206 0.05761423 0.8382353  29.648895 136
3     120.0 0.07058824 0.04696682 0.5882353   8.333333  17
NA       NA         NA         NA        NA         NA  NA
... ...
NA.8     NA         NA         NA        NA         NA  NA
13    650.0 0.00500000         NA 1.0000000 200.000000   1
NA.9     NA         NA         NA        NA         NA  NA
.. ...
NA.12    NA         NA         NA        NA         NA  NA
18    900.0 0.00500000         NA 1.0000000 200.000000   1

我想以这样的方式制作一个 if-else 语句,只有当数据框中的所有 'dii' 值 >= 20 并且 'fsf' >= 0.8 时,该函数才会打印“GOOD”,否则“你有问题!”。所以我尝试了这样的事情-

if (dpd$fsf[!is.na(dpd$fsf)] > 0.8 & dpd$dii[!is.na(dpd$dii)] >= 20)
print("GOOD") else print("You have problem!")

数据框清楚地表明,第 3 行的值不符合这两个条件,但 R 只考虑第一个元素,如下所示:

[1] "GOOD"
Warning message:
In if (dpd$fsf[!is.na(dpd$fsf)] > 0.8 & dpd$dii[!is.na(dpd$dii)] >=  :
  the condition has length > 1 and only the first element will be used

如何改进我的条件语句,使其显示“您有问题!”另外,有什么方法可以用我选择的颜色打印文本“GOOD”?

【问题讨论】:

    标签: r if-statement dataframe conditional-statements


    【解决方案1】:

    由于fsfdii 中的NA 值,您的情况有点复杂。您需要在对all(...) 的调用中使用na.rm=T。将其用于 dpd:

    dpd
    #      id    md       mean         sd       fsf        dii   n
    # 1     2  77.5 0.02827206 0.05761423 0.8382353  29.648895 136
    # 2     3 120.0 0.07058824 0.04696682 0.5882353   8.333333  17
    # 3  <NA>    NA         NA         NA        NA         NA  NA
    # 4  NA.8    NA         NA         NA        NA         NA  NA
    # 5    13 650.0 0.00500000         NA 1.0000000 200.000000   1
    # 6  NA.9    NA         NA         NA        NA         NA  NA
    # 7 NA.12    NA         NA         NA        NA         NA  NA
    # 8    18 900.0 0.00500000         NA 1.0000000 200.000000   1
    
    with(dpd, if(all(fsf>=0.8 & dii>=20)) print("Good") else print("Problem")) 
    # [1] "Problem"  
    
    # remove the "bad" item (2nd row)
    dpd.ok <- dpd[-2,]    # should print "Good"
    # but it doesn't...
    with(dpd.ok, if(all(fsf>=0.8 & dii>=20)) print("Good") else print("Problem"))
    # Error in if (all(fsf >= 0.8 & dii >= 20)) print("Good") else print("Problem") : 
    #   missing value where TRUE/FALSE needed
    
    # setting na.rm=T fixes it
    with(dpd.ok, if(all(fsf>=0.8 & dii>=20,na.rm=T)) print("Good") else print("Problem"))
    # [1] "Good"
    

    【讨论】:

      【解决方案2】:

      如果您想检查 所有 逻辑条件是否评估为 TRUE,您应该将函数 all 包裹在它周围。否则,您有一个逻辑向量,其中 ifif 中包含多个元素,而if 将仅使用该向量的第一个元素。

      x <- 1:3
      y <- 1:3
      
      x > 2 & y < 3
      [1] FALSE FALSE FALSE
      
      if (x < 2 & y < 3) print("good")
      [1] "good"
      Warning message:
      In if (x < 2 & y < 3) print("good") :
        the condition has length > 1 and only the first element will be used
      

      现在检查逻辑向量的所有元素是否都是TRUE

      all(x > 2 & y < 3)
      [1] FALSE
      if (all(x > 2 & y < 3)) print("good")
      

      【讨论】:

      猜你喜欢
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2017-03-09
      • 2020-11-02
      • 1970-01-01
      • 2023-02-25
      • 2022-07-13
      相关资源
      最近更新 更多