【问题标题】:IF/THEN/ELSE in RR中的IF/THEN/ELSE
【发布时间】:2015-06-07 21:51:35
【问题描述】:

每个人。

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

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

感谢任何帮助!提前致谢!

【问题讨论】:

  • R 不是 SAS(也不是 SPSS)。您需要学习基础教程并完成示例。如果您为此目的使用的任何文本都不能解释 btwn ififelse 的区别,那么您应该把它扔掉。 (此外,您对“=”的使用是错误的。)

标签: r if-statement syntax


【解决方案1】:

应该做两处改变:

  1. 使用矢量化的ifelse() 函数生成新的列数据。
  2. 在组合比较结果时使用矢量化的&amp; 逻辑与运算符。

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 语句和&amp;&amp; 运算符未矢量化。 &amp;&amp; 运算符仅检查每个操作数向量的第一个元素,并且仅返回一个单元素向量,该向量表示这两个输入值的逻辑与结果。 if 语句的条件总是需要一个元素向量,如果该元素为真则执行 if-branch,如果为 false 则执行 else-branch。

如果在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

但出于某种奇怪的原因,如果您使用多元素向量作为&amp;&amp;(或||)的操作数,您不会收到警告:

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

这就是您的代码看起来成功的原因(我的意思是它没有打印任何警告消息),但实际上并没有达到预期的效果。

【讨论】:

    【解决方案2】:

    当在算术中使用 TRUEFALSE 变成 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      相关资源
      最近更新 更多