r语言 - seq.default(1, 1, length.out = nrow(x)) 中的错误:参数 'length.out' 的长度必须为 1



我正在尝试制作一个简单的函数,如果它不是异常值,则查找异常值并将相应的观察结果标记为valid.obs=1,如果它确实是异常值,则标记为valid.obs=0。 例如,对于变量"收入",将根据以下公式标识异常值:if

收入>=(99%(收入)+standard_deviation(收入)),那么它是一个异常值。 如果收入<(99%(收入)+standard_deviation(收入)),那么它不是异常值。

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) 
}

我继续将此函数应用于数据帧的单个列。数据帧有 132 个变量,包含 5000 个条目。我选择变量"收入">

apply(data["income"],2,rem)

它,然后显示错误:

Error in seq.default(1, 1, length.out = nrow(x)) : 
argument 'length.out' must be of length 1 

在函数"rem"之外,以下代码工作正常:

nrow(data["income"])
[1] 5000

我是R的新手,我的军械库中还没有很多功能。这个函数的目标非常简单。请让我知道为什么这个错误会悄悄出现,如果有更简单的方法可以解决这个问题?

使用

v = rep(1, length.out = length(x))

apply遍历数据框的"边距"或行/列,并将数据框列作为命名向量传递给FUN。向量将具有长度,但没有行数。

即。在雷姆内部你正在通过

> nrow(c(1,2,3))
NULL

与您的错误没有直接关系的其他一些事情:

出于与上述相同的原因,无需在sapply内部调用sd。只需在向量上正常调用它即可。

s=sd(x,na.rm=TRUE) #calculating the standard deviation

您还可以使用 简化三行(并完全消除初始问题)

v=as.numeric(x<uc)

这将创建一个逻辑向量(自动与x长度相同),其TRUE/FALSE值基于<uc。要获得 0 和 1,只需用as.numeric强制逻辑值

最后,如果您需要做的就是根据要返回的值incomedata添加一列,则改为v并像这样调用函数

data$valid.obs <- rem(data$income)

您的函数现在将返回一个向量,该向量基本上可以以新名称valid.obs添加到data

相关内容

最新更新