我的基本R代码有错误?在需要TRUE / FALSE的地方缺少值

问题描述 投票:1回答:3

基本上,我正在尝试从R中的向量中删除一些元素,但我不断收到此错误:缺少需要TRUE / FALSE的值这是代码:

exA2b = function(x){
  m=mean(x)
  s=sd(x)
  print(x)
  for(i in 1:length(x))
  {
    if(x[i]<=m-2*s|x[i]>=m+2*s)
    {
      x=x[-i]
    }
  }
  print(x)
}
x=scan("test.txt")
exA2b(x)

这是文本文件:

79 71 89 57 76 64 82 82 67 80 81 65 73 79 79
60 58 83 74 68 78 80 78 81 76 65 70 76 58 82
59 73 72 79 87 63 74 90 69 35 83 76 61 66 71
51 57 81 57 65 81 78 77 81 81 73 75 66 56 62
75 60 74 74 70 71 56 74 63 72 81 54 72 91 92

我想这与NA值有关,但我无法弄清楚

r rstudio
3个回答
0
投票

没关系,我通过在第一个if条件之前添加if(!is.na(x [i]))解决了这个问题!如果有人遇到相同的问题,下面是代码:

exA2b = function(x){
  m=mean(x)
  s=sd(x)
  print(x)
  for(i in 1:length(x))
  {
    if(!is.na(x[i])){
    if(x[i]<=m-2*s|x[i]>=m+2*s)
    {
      x=x[-i]
    }
  }}
  print(x)
}
x=scan("test.txt")
exA2b(x)

0
投票

这应该做您想做的事情:

exA2B <- function(x){
  m=mean(x)
  s=sd(x)
  print(x)
  x[ifelse(x<=m-2*s|x>=m+2*s, FALSE, TRUE )]
 }

您的错误来自x = x [-i]。 R不喜欢从数据集中删除当前正在进行的迭代。

我提供的解决方案使您的问题更容易理解,因此它可以更快地运行,并且可以打印出新旧版本。


0
投票

是,是因为NA。问题是您正在执行length(x)次操作,但是您正在以这种方式删除x的某些元素。假设您一路上删除了3个元素;现在,在最后3次迭代中,您将获得一个NA

这将完成您想要的:

exA2b = function(x){
  y = x
  m=mean(x)
  s=sd(x)
  print(x)
  x = x[!(x<=m-2*s | x>=m+2*s)]
  print(x)
}
exA2b(x)
© www.soinside.com 2019 - 2024. All rights reserved.