数据框有0列和0行错误

时间:2013-06-13 19:29:14

标签: r function dataframe

我正在编写一种方法,可以找到异常值并将其打印给用户,旁边还有一个表示异常值类型的特殊符号。异常值可以通过两种方式计算:工程师方法或Tukey方法。该函数采用两个参数:具有一列随机数的数据帧和确定用于计算异常值的方法的选项值。该函数将返回一个数据框,其中两列为异常值,其类型为符号(o或*)

当我调用该函数并且我要求它使用工程师的方法计算异常值时,它可以完美地工作。但是,使用Tukey的方法会产生以下错误(数据帧为0列和0行)

以下是我的代码:

findOutliers<- function(numbers,option){
outlierM=c()
outlierE=c()
outlier=c()
typeM=c()
typeE=c()
type=c()
length=nrow(numbers)
print(numbers)


if(option=="eng"){
print("Engineer Methods")
numbersmean= as.numeric(sapply(numbers,mean)) 
numbersd= as.numeric(sapply(numbers,sd))


for(i in 1:length){
zscore= as.numeric((i-numbersmean)/numbersd)
if(zscore>2 & zscore<3){
#cat(zscore," ", "O","\n")
outlierM =c(outlierM,zscore)
typeM=c(typeM, "O")
}#end of if statment

else if(zscore>3){
#cat(zscore," ", "*", "\n")
outlierE =c(outlierE,zscore)
typeE=c(typeE, "*")


}#end of if statment

}#end of for loop
}#end of if statment


else if(option=="tukey"){
print("Tuckey's Methods")
sortedNumbers=numbers[order(numbers$Numbers), ]
IQR=IQR(sortedNumbers)
Q1=as.numeric(quantile(sortedNumbers,0.25))
Q3=as.numeric(quantile(sortedNumbers,0.75))
rangeM1=Q1 - (1.5 * IQR)
rangeM2=Q3 + (1.5 * IQR)
rangeE1=Q1 - (3 * IQR)
rangeE2=Q3 + (3 * IQR)

for(i in 1:length){
if(numbers[i,]<rangeM1|numbers[i,]>rangeM2){
outlierM=c(outlierM,numbers[i])
typeM=c(typeM, "O")
}#end of if statment

else if(numbers[i,]<rangeE1|numbers[i,]>rangeE2){
outlierE=c(outlierE, numbers[i])
typeE=c(typeE, "*")}

}# end of for loop 
}#end of if statment



outlier= c(outlierM,outlierE)
type=c(typeM,typeE)
founOtliers<- data.frame(Outliers=outlier,Type=type)
return(founOtliers)

}#end of function

normalnumbers=rnorm(10)
randomNumbers<- data.frame(Numbers=normalnumbers)
findOutliers(randomNumbers,"eng")
findOutliers(randomNumbers,"tukey")

1 个答案:

答案 0 :(得分:4)

2件事。首先,我建议缩小您的代码并尽可能使用空格。

if (x = 1) {
  print ('foo')
} else {
  print ('bar')
}

其次,更重要的是,您正在使用if / else语法错误(请参阅上面的示例)。来自?"if"

In particular, you should not have a newline between ‘}’ and
     ‘else’ to avoid a syntax error in entering a ‘if ... else’

但是,在您的代码中,这不是问题。如果添加行

print (paste('first check', 
             numbers[i, ] < rangeM1 | numbers[i, ] > rangeM2))
print (paste('second check', 
             numbers[i, ] < rangeE1 | numbers[i, ] > rangeE2))

在第二个for循环的顶部,您会看到您从未满足if条件,因此您将返回空data.frame ...

一般情况下,如果您使用的是if else if语法,我认为始终包含最终的else catchall是明智的,它可以提供一些有用的建议或默认输出