R中的IF / THEN / ELSE

时间:2015-04-02 20:01:17

标签: r if-statement syntax

大家。

希望是一个简单的语法问题。我试图在R中的表中创建一个新变量,它会说" 1"如果我的病人在我看的年龄范围内,或者" 0"不。我感兴趣的年龄范围在2-155之间。代码运行没有任何错误,但它无法正常工作。当我查看我的表时,即使age4为158,新变量也会显示为1这就是我所拥有的:

table$newvar <- if (table$age4>=2 && table$age4 <=155) {table$newvar=1} else {table$newvar=0}

任何帮助表示赞赏!提前谢谢!

2 个答案:

答案 0 :(得分:4)

应该进行两项更改:

  1. 使用向量化的ifelse()函数生成新的列数据。
  2. 在组合比较结果时使用向量化的& logical-AND运算符。

  3. table <- data.frame(age4=seq(1,200,10));
    table$newvar <- ifelse(table$age4>=2 & table$age4<=155,1,0);
    table;
    ##    age4 newvar
    ## 1     1      0
    ## 2    11      1
    ## 3    21      1
    ## 4    31      1
    ## 5    41      1
    ## 6    51      1
    ## 7    61      1
    ## 8    71      1
    ## 9    81      1
    ## 10   91      1
    ## 11  101      1
    ## 12  111      1
    ## 13  121      1
    ## 14  131      1
    ## 15  141      1
    ## 16  151      1
    ## 17  161      0
    ## 18  171      0
    ## 19  181      0
    ## 20  191      0
    

    您的代码无效的原因是if语句和&&运算符未向量化。 &&运算符仅检查每个操作数向量的第一个元素,并仅返回表示这两个输入值上的逻辑AND结果的单元素向量。 if语句总是期望其条件的单元素向量,如果该元素为真,则执行if分支,如果为false,则执行else分支。

    如果在if语句中使用多元素向量作为条件,则会收到警告:

    if (c(T,F)) 1 else 0;
    ## [1] 1
    ## Warning message:
    ## In if (c(T, F)) 1 else 0 :
    ##   the condition has length > 1 and only the first element will be used
    

    但是由于一些奇怪的原因,如果您使用多元素向量作为&&(或||)的操作数,则不会收到警告:

    c(T,F) && c(T,F);
    ## [1] TRUE
    

    这就是为什么你的代码似乎成功(我的意思是它没有打印任何警告信息),但它实际上没有做到预期的事情。

答案 1 :(得分:0)

在算术TRUE中使用时,FALSE变为10所以:

transform(table, newvar = (age4 >= 2) * (age4 <= 155) )

这些也有效:

transform(table, newvar = as.numeric( (age4 >= 2) & (age4 <= 155) ) )

transform(table, newvar = ( (age4 >= 2) & (age4 <= 155) ) + 0 )

transform(table, newvar = ifelse( (age4 >= 2) & (age4 <= 155), 1, 0) )

transform(table, newvar = (age4 %in% 2:155) + 0) # assuming no fractional ages