R中的IF / THEN / ELSE

Emi*_*y V 1 syntax if-statement r

大家。

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

table$newvar <- if (table$age4>=2 && table$age4 <=155) {table$newvar=1} else {table$newvar=0}
Run Code Online (Sandbox Code Playgroud)

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

bgo*_*dst 5

应该进行两个更改:

  1. 使用向量化ifelse()函数生成新的列数据。
  2. &合并比较结果时,请使用向量化的逻辑AND运算符。

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
Run Code Online (Sandbox Code Playgroud)

您的代码不起作用的原因是因为if语句和&&运算符未向量化。所述&&操作者仅检查每个操作数向量的第一元素,并且仅返回表示逻辑与这些两个输入值的结果的一个元素的矢量。该if语句始终期望一个单元素向量作为其条件,如果该元素为true,则执行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
Run Code Online (Sandbox Code Playgroud)

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

c(T,F) && c(T,F);
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

这就是为什么您的代码似乎成功的原因(我的意思是它没有显示任何警告消息),但实际上并未执行预期的操作。