根据两组目标值在新数据框列中生成逻辑向量

Generating logic vector in a new data frame column based on two sets of target values

我有一个数据框的形式:

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,以及关于它是工作日还是 'off' 日(即周末或假期)的逻辑陈述。

Target 值是计算变量,用于确定测量值是否应被视为极端值(换言之,异常值)。这两个目标之间的 value 被认为是正常的,'value' 高于 hiTarget 或低于 loTarget 被认为是极端的。

如果offFalse(即'On'),评估value看它是否在hiOnTarget和[=22=之间].如果 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"}

我显然只做到了一半,因为这将盲目地评估整个计算 'on',但我什至无法让这部分工作。我计划使用 switch() 在两个相似的 if(){}else{} 命令之间切换,尽管完全替代的解决方案会很好。

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

您可以通过使用逻辑索引列 exampleCurrent$off 对行进行子集化来完成此操作,同时根据其数字索引或列名对相关列进行子集化。检查 "value" 是否位于 "Target" 列之间,并将逻辑索引分配给 "extremeValue" 列。

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

我认为最简单的做法是创建相关目标的中间对象。就两行,读起来很容易理解

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)