2016-04-10 110 views
1

我使用生成的600長度樣本:如何使用if語句在r中增加兩個變量?

x <- rnorm(600, mean = 30, sd = 10) 

,然後使用由另一個600長名單:

y = ((x-30)/10) 

,我的計劃是需要如果測試y是否語句大於1.96如果-y小於1.96,並且如果發生這種情況,則將變量a增加1,如果這沒有發生,則將變量b增加1.

我試過了fo llowing事情:

a = 0 
b = 0 

ifelse(y > 1.96, inc(a) <- 1, inc(b) <- 1) 
ifelse(-y < -1.96, inc(a) <- 1, inc(b) <- 1) 

錯誤INC(一)< - 1:找不到功能 「增量< - 」 錯誤INC(B)< - 1:找不到函數「INC < - 「

ifelse(y > 1.96, '+'(a) <- 1, '+'(b) <- 1) 
ifelse(-y < -1.96, '+'(a) <- 1, '+'(b) <- 1) 

錯誤+一個< - 1:找不到功能 」+ < - 「 誤差在+ B < - 1:找不到函數 「+ < - 」

if (y > 1.96) { 
    a = a + 1 
} 
if (-y < -1.96) { 
    a = a + 1 
} else{ 
    b = b + 1 
} 

警告消息: 在如果(Y> 1.96){: 條件具有長度> 1且只第一個元素將被用於

ifelse(y > 1.96, a <- a + 1, b <- b + 1) 
ifelse(-y < -1.96, a <- a + 1, b <- b + 1) 

這幾乎工作,但它給了我全部爲1的輸出和:

a 
    # [1] 1 
    b 
    # [1] 1 

那麼我該如何增加變量或者我做錯了什麼?

+2

如果y> 1.96,那麼-y必須<-1.96。 R是矢量化的,所以sum(y> 1.96)等將起作用 –

回答

5

避免使用ifelse()進行此類計算。在這種情況下,最好使用R的向量化屬性(例如,在僅R個向量中不存在「標量」),方法是獲取值的向量,然後求和值TRUE值。

# Make the data 
set.seed(1337) 
x = rnorm(600, mean = 30, sd = 10) 

y = ((x-30)/10) 

# Get Indicators (T/F) 
v1 = y > 1.96 

v2 = y < -1.96 

# Sum over w.r.t to true cases 
a = sum(v1) + sum(v2) 

# Handle the false cases without resumming. 
b = 2*length(y) - a 

另外,在這裏我們選擇使用y < -1.96來獲得適當的雙面計數。