0

我有一个值向量(仅限数字)。我想把这个向量分成两个向量。一个向量将包含小于原始向量平均值的值,另一个向量将包含大于原始向量平均值的值。我有以下作为测试 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 在评论中指出了为什么您的代码不起作用:您需要v在使用if. 但是,您可能会split为这样的任务找到更好的功能:

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

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

谜团的答案v.out是它的分支没有被选中,所以它不会被改变。因此,它保留了它的初始值,它(可能)错误地给出了一个单一的值0和向量 ( ) 的长度,9而不是我怀疑你想要的九个零副本。

于 2012-09-15T00:03:56.360 回答