在外部但不在R函数内工作的complete.cases()?

时间:2018-03-19 22:28:35

标签: r function dataframe

我想知道为什么当我跑步时:iris[complete.cases(iris), ]它的效果非常好。但是当我从下面的函数中做同样的事情时,它会给我一个错误:colMeans(x, na.rm = TRUE) : 'x' must be numeric

P.S。 scale()适用于data.frames ==> scale(mtcars)

可以修复吗?

以下是功能:

standard <- function(data, scale = TRUE, center = TRUE, na.rm = TRUE){

data <- if(na.rm) data[complete.cases(data), ]    

data[paste0(names(data), ".s")] <- scale(data, center = center, scale = scale)
return(data)
}
# EXAMPLE:
standard(iris)

1 个答案:

答案 0 :(得分:2)

编辑:

是的,错误是由scale()抛出的,而不是之前的错误。如果要缩放所有数字列并按原样保留其他列,则需要添加一个提取数字列的步骤,缩放它们,然后将它们重新放入。顺便说一下,scale可以处理NA值,所以您可以在complete.cases()之后发出scale来电。

原始答案:

您可以通过在函数中添加对browser()的调用来逐步执行此操作,但我怀疑您会在此处发现错误:

scale(data, center = center, scale = scale)

请参阅scale()

上的文档
  

参数

     

x数字矩阵(如对象)。

以下是调试方法:

使你的功能成为现实:

standard <- function(data, scale = TRUE, center = TRUE, na.rm = TRUE){
  browser()
  data <- if(na.rm) data[complete.cases(data), ]    

  data[paste0(names(data), ".s")] <- scale(data, center = center, scale = scale)
  return(data)
}

然后尝试使用standard(immer)调用它 它将打开一个浏览器,让您逐步执行该函数中的每个语句。如果在RStudio中执行此操作,则可以在右上方窗口的“环境”选项卡中查看环境更改。使用命令help查看如何浏览浏览器,但一般情况下,您将使用n和/或s逐步浏览每个语句。 Q让您退出浏览器,并从您的函数中删除browser()调用,让您可以像平常一样运行它。