Normalizing a dataframe - Error : non-numeric argument to binary - R
Normalizing a dataframe - Error : non-numeric argument to binary - R
我遇到了类似的问题,但仍然无法解决我的问题。反正,
我有一个包含数字的数据框(大小: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)
时它显示 df
是 list
但是当我使用 is.list(df)->TRUE
和 is.data.frame(df)->TRUE
检查它时, 这让我很困惑。
谢谢
问题与变量 class 有关。检查 class - class( mtcars$mpg ) 。此函数会将您的 cols 转换为 numeric
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)
归一化(as.character(mtcars$mpg))
您可以添加到您的数据框
mtcars$newvar <- normalize( mtcars$mpg )
或者做几个cols
mtcars[ , 3:7]<- sapply( mtcars[ , 3:7], normalize )
您可以仅通过 mutate_if
来自 dplyr
的数值变量来解析 normalize
函数。
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
我遇到了类似的问题,但仍然无法解决我的问题。反正, 我有一个包含数字的数据框(大小: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)
时它显示 df
是 list
但是当我使用 is.list(df)->TRUE
和 is.data.frame(df)->TRUE
检查它时, 这让我很困惑。
谢谢
问题与变量 class 有关。检查 class - class( mtcars$mpg ) 。此函数会将您的 cols 转换为 numeric
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) 归一化(as.character(mtcars$mpg))
您可以添加到您的数据框
mtcars$newvar <- normalize( mtcars$mpg )
或者做几个cols
mtcars[ , 3:7]<- sapply( mtcars[ , 3:7], normalize )
您可以仅通过 mutate_if
来自 dplyr
的数值变量来解析 normalize
函数。
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