2015-01-09 84 views
1

我有形式的数据帧:生成逻辑矢量值

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

我认为最简单的做法是创建相关目标的中间对象。这仅仅是两行,可以很容易地阅读和理解

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) 
+0

的变化或为'变换(exampleCurrent,extremeValue =值>关闭* hiOffTarget +(关)* hiOnTarget!|值<关* lowOffTarget +(关闭)* loOnTarget)' – akrun

+0

@ arvi1000,这个工程,我想我理解它的大部分。但是,我对包含'with'的问题感到困惑。 R帮助状态: 在从数据构建的环境中评估R表达式,可能会修改(复制)原始数据。 对我不好理解,我认为这就是R所做的事情? – DaveRGP

+1

在这里,'with(data_frame_name,expression)'只是清理代码的一种方法。为了避免重复'data_frame_name',我们说''expression'中的所有对象都是data.frame'的组件。因此,'with(exampleCurrent,ifelse(off,hiOffTarget,hiOnTarget))'与'ifelse(exampleCurrent $ off,exampleCurrent $ hiOffTarget,exampleCurrent $ hiOnTarget')是一样的。 – arvi1000

1

您可以通过使用逻辑索引列exampleCurrent$off来对行进行子集分配,而关注的列则根据其数字索引或列名称进行子集分配。检查“值”是否位于“目标”列之间,并将逻辑索引分配给“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