基于两组目标值在新数据帧列中生成逻辑向量

时间:2015-01-09 17:00:58

标签: r if-statement

我有一个以下形式的数据框:

exampleCurrent <- data.frame(value = c(5, 4.5, 3, 2.9, 1.5),
             off = as.logical(c("F", "F", "T", "T", "F")),
             hiOnTarget = c(5.5, 4, 5, 4.7, 4),
             loOnTarget =c(4, 3, 3, 4, 3),
             hiOffTarget = c(2, 3, 4, 2, 3),
             lowOffTarget = c(1, 2, 1, 1.2, 2))

数据的上下文是一个测量的value,以及一个关于它是工作日还是“关闭”日(即周末或假日)的逻辑陈述。

Target值是计算变量,用于识别测量值是否应被视为极值(换句话说,是异常值)。这两个目标之间的value被认为是正常的,高于hiTarget或低于loTarget的“值”被认为是极端的。

如果offFalse(即“开启”),则评估value是否在hiOnTargetloOnTarget之间。如果offTrue,则value需要针对hiOffTargetloOffTarget

进行衡量

我想了解以下内容:

exampleWanted <- data.frame(value = c(5, 4.5, 3, 2.9, 1.5),
                        off = as.logical(c("F", "F", "T", "T", "F")),
                        hiOnTarget = c(5.5, 4, 5, 4.7, 4),
                        loOnTarget =c(4, 3, 3, 4, 3),
                        hiOffTarget = c(2, 3, 4, 2, 3),
                        lowOffTarget = c(1, 2, 1, 1.2, 2),
                        extremeValue = as.logical(c("F", "T", "F", "T", "T")))

我尝试生成第六列extremeValue,以if(){}else{}样式逻辑语句为中心,其中最接近的是:

 exampleWanted <- if( exampleCurrent$value > exampleCurrent$hiOnTarget | exampleCurrent$value > exampleCurrent$loOnTarget) {
    exampleWanted <-"True"
    } else {
        exampleWanted <-"False"}

我显然只有一半在这里,因为这将盲目地评估计算完全“开启”,但是我甚至无法让这部分工作。我打算使用switch()在两个相似的if(){}else{}命令之间切换,但完全替代的解决方案也没问题。

N.B。这是我在教程之外编写的第一个主要R脚本的一小部分,所以对可能实际上是一个简单问题的道歉表示道歉。

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是创建相关目标的中间对象。这只是两行,并且易于阅读和理解

relevantTarget <- 
  data.frame(hi=with(exampleCurrent, ifelse(off, hiOffTarget, hiOnTarget)),
             lo=with(exampleCurrent, ifelse(off, lowOffTarget, loOnTarget)))

exampleCurrent$extremeValue <-
  with(exampleCurrent, value < relevantTarget$lo | value > relevantTarget$hi)

答案 1 :(得分:1)

您可以使用逻辑索引列exampleCurrent$off对行进行子集化,同时根据数字索引或列名称对相关列进行子集化。检查&#34;值&#34;位于&#34; Target&#34;列并将逻辑索引分配给&#34; extremeValue&#34;列。

exampleCurrent$extremeValue <- FALSE
indx <- exampleCurrent$off
exampleCurrent$extremeValue[!indx] <-with(exampleCurrent[!indx, c(1,3:4)], 
           !(value >= loOnTarget & value < hiOnTarget))
exampleCurrent$extremeValue[indx] <-with(exampleCurrent[indx, c(1,5:6)],
    !(value >= lowOffTarget & value < hiOffTarget))

 identical(exampleCurrent, exampleWanted)
 #[1] TRUE