【问题标题】:mysterious values as output in vector R using if and else使用 if 和 else 在向量 R 中输出的神秘值
【发布时间】:2012-09-14 23:42:04
【问题描述】:

我有一个值向量(仅限数字)。我想把这个向量分成两个向量。一个向量将包含小于原始向量平均值的值,另一个向量将包含大于原始向量平均值的值。我有以下作为测试 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 中任何元素的值。

对发生了什么以及如何解决此问题有何建议?

谢谢, 埃德

【问题讨论】:

  • 将条件更改为(v[i] &lt; 0.68 * mean(v))(即在不等式左侧使用v[i] 而不是v
  • 还有c(rep(0),length(v))应该是rep(0, length(v))
  • 并且您使用的缩进样式通常与 R 不兼容。请参阅burns-stat.com/pages/Tutor/R_inferno.pdf 的“意外其他”部分以获得很好的解释。
  • 谢谢 Ben,我用 if(v[i]

标签: r for-loop compare if-statement


【解决方案1】:

@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),而不是我怀疑你想要的九个零副本。

【讨论】:

  • 谢谢詹姆斯!快速简便的解决方案。
猜你喜欢
  • 2016-10-13
  • 2013-01-08
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多