我有一个以下形式的数据框:
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
的“值”被认为是极端的。
如果off
为False
(即“开启”),则评估value
是否在hiOnTarget
和loOnTarget
之间。如果off
为True
,则value
需要针对hiOffTarget
和loOffTarget
我想了解以下内容:
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脚本的一小部分,所以对可能实际上是一个简单问题的道歉表示道歉。
答案 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