我有一个值的向量(仅限数字)。我想把这个向量分成两个向量。一个向量包含的值将小于原始向量的平均值,另一个向量将包含的值大于原始向量的均值。我有以下作为测试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.中任何元素的值
有什么建议吗?发生了什么以及如何解决这个问题?
谢谢,Ed
@BenBolker在评论中指出了代码不起作用的原因:使用if
时,需要从v
中选择一个元素。然而,您可能会发现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
),而不是我怀疑你想要的九个零拷贝。