2012-03-13 123 views
0

我想R到以下: 如果LocID等於3,4,7,8,14,則數據$ newConc等於數據$ conc/2 否則數據$ newConc < - 數據$濃#否則保持濃度相同簡單如果else語句中的語法錯誤在R

data$newConc <- if(data$LocID == c(3,4,7,8,14)) 
data$conc/2 else data$conc 

str(data) 
$ LocID  : int 1 2 3 4 5 6 7 8 9 10 ... 
$ time  : int 1 1 1 1 1 1 1 1 1 1 ... 
$ conc  : num 0.03695 0.0155 0.00738 0.00753 0.01795 ... 

警告: 條件具有長度> 1,只有第一個元素將被用於

+1

您提供的R代碼無效......沒有平衡括號?你的意思是'ifelse'? – 2012-03-13 04:59:24

+0

我編輯了我的語法 – Amateur 2012-03-13 05:28:16

回答

5

至於我可以告訴你代碼(它甚至不會運行,由於缺少右括號?)您正在嘗試執行(僞代碼):

foreach row in data 
    if row$LocID is one of 3, 4, 7, 8, or 14 
    THEN set row$newConc to row$conc/2 
    ELSE set row$newConc to row$conc 

爲此,您可以使用ifelse

此外,如果你想測試一個值是否等於OT 3,4,7,8或14,然後不使用== - 這將返回一個矢量布爾值,和if需要單個布爾,因此你的錯誤。

要麼使用data$locID %in% c(3,4,7,8,14)返回一個 TRUE/FALSE,或使用any(data$locID == c(3,4,7,8,14))把布爾的載體導入一個布爾:

你是個標量比較矢量,所以你的輸出一個向量。一個if語句只需要一個布爾值(不是布爾值的向量)。

要麼使用data$locID %in% c(3,4,7,8,14)返回一個單個 TRUE/FALSE,或者使用any(data$locID == c(3,4,7,8,14))轉布爾值的向量成單個布爾值:

data$newConc <- ifelse(data$locID %in% c(3,4,7,8,14), 
         data$conc/2, 
         data$conc) 

備選地我可以使用ifelse(any(data$locID == c(3,4,7,8,14)), ...)