0

値のベクトルがあります (数値のみ)。このベクトルを 2 つのベクトルに分割したいと思います。1 つのベクトルには元のベクトルの平均よりも小さい値が含まれ、もう 1 つのベクトルには元のベクトルの平均よりも大きい値が含まれます。テストRスクリプトとして次のものがあります。

v <- c(1,1,4,6,3,67,10,194,847)

#Initialize
v.in<- c(rep(0),length(v))
v.out<- c(rep(0),length(v))

for (i in 1:length(v))
{
   if (v < 0.68 * mean(v))
   {
      v.in[i] <- v[i]
   }
   else
   {
      v.out[i] <- v[i]
   }
}
v.in
v.out

## <https://gist.github.com/8a6747ea9b7421161c43>

次の結果が得られます。

9: In if (v < 0.68 * mean(v)) { :
  the condition has length > 1 and only the first element will be used
> v.in
[1]   1   1   4   6   3  67  10 194 847
> v.out
[1] 0 9
> v
[1]   1   1   4   6   3  67  10 194 847
> 

明らかに、0 と 9 は v のどの要素の値でもありません。

何が起こっているのか、これを修正する方法はありますか?

ありがとう、エド

4

1 に答える 1

3

@BenBolker は、コードが機能しない理由をコメントで指摘しましvifsplitただし、次のようなタスクにはより適切な関数が見つかる場合があります。

split(v,v<0.68*mean(v))
$`FALSE`
[1] 194 847

$`TRUE`
[1]  1  1  4  6  3 67 10

の謎に対する答えv.outは、ブランチが選択されないため、変更されないということです。したがって、初期値が保持されます。これは、意図したと思われるゼロの 9 つのコピーではなく、 (おそらく) 単一の値と0ベクトルの長さ ( ) が誤って与えられたものです。9

于 2012-09-15T00:03:56.360 に答える