【问题标题】:Error in seq.default(1, 1, length.out = nrow(x)) : argument 'length.out' must be of length 1seq.default(1, 1, length.out = nrow(x)) 中的错误:参数“length.out”的长度必须为 1
【发布时间】:2025-11-24 21:25:01
【问题描述】:

我正在尝试创建一个简单的函数来查找异常值并将相应的观察标记为 valid.obs=1 如果它不是异常值,或者 valid.obs=0 如果它确实是一个异常值。 例如,对于变量“income”,将根据以下公式识别异常值:if

income>=(99percentile(income)+standard_deviation(income)),则为异常值。 如果income

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 新手,我的军械库中还没有很多函数。这个函数的目标很简单。请让我知道为什么会出现此错误以及是否有更简单的方法来解决此问题?

【问题讨论】:

    标签: r function seq


    【解决方案1】:

    使用

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

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

    即。在 rem 你正在传递

    > 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 的值基于&lt;uc。要获得您的 0 和 1,只需使用 as.numeric 强制逻辑值

    最后,如果您需要做的只是根据income 中的值向data 添加一列,您希望返回v,然后像这样调用函数

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

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

    【讨论】:

      最近更新 更多