2016-04-10 11 views
1

私が使用して600の長さのサンプルを生成:if文を使ってrの2つの変数を増やす方法は?

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

をしてから使用して別の600の長さのリストを作った:

y = ((x-30)/10) 

をし、私の計画があれば、yが1.96より大きく、あるかどうかをテストするステートメントを持つことです-yが1.96より小さい場合は、変数aを1だけインクリメントし、そうでない場合は、変数bを1だけインクリメントします。

私は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) 

エラー(a)の<から1:機能を見つけることができませんでした "INC < - " INCで エラー(b)は<から1:機能を見つけることができませんでした「株式会社< - 「< +で

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()を使用しないでください。この場合、TRUE/FALSEという値のベクトルを取得し、次にTRUEの値を合計することによって、Rのベクトル化プロパティを使用する方がよい(Rのみのベクトルには「スカラー」がないなど)。

# 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 

はまた、ここでは、適切な2側のカウントを取得するためにy < -1.96を使用することを選びます。

関連する問題