基本上,我正在尝试从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值有关,但我无法弄清楚
没关系,我通过在第一个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)
这应该做您想做的事情:
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不喜欢从数据集中删除当前正在进行的迭代。
我提供的解决方案使您的问题更容易理解,因此它可以更快地运行,并且可以打印出新旧版本。
是,是因为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)