2016-04-10 61 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来获得适当的双面计数。