我正在尝试创建一个简单的函数来查找异常值并将相应的观察标记为valid.obs = 1如果它不是异常值,或者valid.obs = 0如果它确实是异常值。 例如,对于变量“收入”,将根据以下公式识别异常值:if
收入> =(99percentile(income)+ standard_deviation(income)),那么它就是一个异常值。 如果收入<(99percentile(income)+ standard_deviation(income)),那么它不是异常值。
(u'2013-10-17', 80325.0)
(u'2014-01-01', 68521.0)
(u'2013-11-10', 83691.0)
(u'2013-11-14', 149289.0)
(u'2013-11-18', 94756.0)
(u'2014-01-30', 126171.0)
我继续将此函数应用于数据帧的单个列。数据框有132个变量,有5000个条目。我选择变量“收入”
rem= function(x){
u=quantile(x,probs=0.99,na.rm=TRUE) #calculating the 99th percentile
s=sapply(x,sd,na.rm=TRUE) #calculating the standard deviation
uc=u+s
v=seq(1,1,length.out = nrow(x))
v[x>=uc]=0
v[x<uc]=1
x$valid.obs=v
return(x)
}
然后显示错误:
apply(data["income"],2,rem)
在函数“rem”之外,以下代码可以正常工作:
Error in seq.default(1, 1, length.out = nrow(x)) :
argument 'length.out' must be of length 1
我是R的新手,我的军械库里的功能还不多。这个功能的目的非常简单。请让我知道为什么这个错误已经悄悄进入,如果有更简单的方法可以解决这个问题?
答案 0 :(得分:1)
使用
v = rep(1, length.out = length(x))
apply
遍历&#34;边距&#34;或数据帧的行/列,并将数据框列作为命名向量传递给FUN
。向量将具有长度但不包括行数。
即。在你内心的传递
> nrow(c(1,2,3))
NULL
与您的错误无直接关系的其他一些事项:
出于与上述相同的原因,无需在sd
内拨打sapply
。只需在矢量上正常调用它即可。
s=sd(x,na.rm=TRUE) #calculating the standard deviation
您还可以使用
简化三行(并完全删除初始问题)v=as.numeric(x<uc)
这将创建一个逻辑向量(自动与x
的长度相同),其TRUE
/ FALSE
值基于<uc
。要获得0和1,只需用as.numeric
最后,如果您需要做的就是根据data
中要返回income
的值,向v
添加一列,并调用该函数
data$valid.obs <- rem(data$income)
您的函数现在将返回一个向量,该向量基本上可以data
的新名称添加到valid.obs