2015-04-02 116 views
0

everyone。IF/THEN/ELSE in R

希望有一個簡單的語法問題。我試圖在R表中創建一個新變量,如果我的患者處於我正在查看的年齡範圍內,那麼會顯示「1」,否則顯示「0」。我感興趣的年齡段在2-155之間。該代碼運行時沒有任何錯誤,但不起作用。當我在我的桌子上看,新的變量會說,即使age4是158這是我有:

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

任何幫助表示讚賞!提前致謝!

+1

R不是SAS(也不SPSS)。您需要學習基本教程並通過示例進行工作。如果你爲此目的使用的任何文本沒有解釋「if」和「ifelse」之間的差異,那麼你應該把它扔掉。 (此外,您使用「=」是錯誤的。) – 2015-04-02 20:26:05

回答

4

兩個修改的話:

  1. 使用矢量ifelse()功能來生成新的列數據。
  2. 合併比較結果時,使用矢量化的&邏輯與運算符。

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語句始終期望其條件爲一個元素的向量,並在該元素爲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 

但對於一些奇怪的原因,你如果你用得到一個警告多元素向量作爲操作數&&(或||):

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

這就是爲什麼你的代碼似乎成功(我指的是它沒有打印任何警告信息),但它實際上並沒有做到預期的目的。

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