2015-01-09 122 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