2012-03-13 127 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)), ...)