根据两组目标值在新数据框列中生成逻辑向量
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
被认为是极端的。
如果off
是False
(即'On'),评估value
看它是否在hiOnTarget
和[=22=之间].如果 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"}
我显然只做到了一半,因为这将盲目地评估整个计算 '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)
我有一个数据框的形式:
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
被认为是极端的。
如果off
是False
(即'On'),评估value
看它是否在hiOnTarget
和[=22=之间].如果 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"}
我显然只做到了一半,因为这将盲目地评估整个计算 '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)