标准化数据帧-错误:二进制的非数字参数-R

时间:2019-05-03 11:04:20

标签: r list dataframe normalize

我遇到了类似的问题,但仍然无法解决我的问题。无论如何, 我有一个数据框(大小:36 * 42),其中包含数字,而在最后一行(第36行)中,它具有每一列的日期。 我想使用以下函数来标准化此数据框的列(除最后一行外的整个数据框):

normalize<-function(x){return((x-min(x, na.rm=TRUE))/(max(x, na.rm=TRUE)-min(x, na.rm=TRUE)))}

但我总是会收到此错误:

Error in x - min(x, na.rm = TRUE) : non-numeric argument to binary operator

我尝试过的东西

as.data.frame(lapply(df[c(1:nrow(df)-1),], normalize))

顺便说一句,当我检查typeof(df)时,它表明dflist,但是当我使用is.list(df)->TRUEis.data.frame(df)->TRUE检查时,这让我感到困惑。

谢谢

2 个答案:

答案 0 :(得分:1)

问题与变量类有关。检查class-class(mtcars $ mpg)。此功能会将您的列转换为数字

normalize<-function(x){

x <- as.numeric( as.character( x ))

y <- (x-min(x, na.rm=TRUE))/
    (max(x, na.rm=TRUE)-min(x, na.rm=TRUE))

return(y)

}

它的工作原理如下:     规范化(mtcars $ mpg)     normalize(as.character(mtcars $ mpg))

您可以添加到数据框

mtcars$newvar <- normalize( mtcars$mpg ) 

或执行几个列

mtcars[ , 3:7]<- sapply( mtcars[ , 3:7], normalize )

答案 1 :(得分:1)

您只能通过带有normalize中带有mutate_if的数字变量来解析dplyr函数。

 library(dplyr)

normalize<-function(x){
 return( (x-min(x, na.rm=TRUE)) / (max(x, na.rm=TRUE)-min(x, na.rm=TRUE)))
}

df %>%
   mutate_if(is.numeric, normalize)

由于您没有从数据中提供样本,因此使用iris数据集将类似于:

iris %>% 
  mutate_if(is.numeric, normalize)

,输出将是(前十行):

#Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#1     0.22222222  0.62500000   0.06779661  0.04166667     setosa
#2     0.16666667  0.41666667   0.06779661  0.04166667     setosa
#3     0.11111111  0.50000000   0.05084746  0.04166667     setosa
#4     0.08333333  0.45833333   0.08474576  0.04166667     setosa
#5     0.19444444  0.66666667   0.06779661  0.04166667     setosa
#6     0.30555556  0.79166667   0.11864407  0.12500000     setosa
#7     0.08333333  0.58333333   0.06779661  0.08333333     setosa
#8     0.19444444  0.58333333   0.08474576  0.04166667     setosa
#9     0.02777778  0.37500000   0.06779661  0.04166667     setosa
#10    0.16666667  0.45833333   0.08474576  0.00000000     setosa