我有一个30行和850列的数据框。该数据的某些列具有“nan”和“inf”值。为了即时,我创建了一个像我这样的数据框样本
test<-data.frame(a=c("inf",1,"inf"),b=c("nan",3,"nan"))
row.names(test)<-c("w1","w2",w)
我已使用此代码将inf和nan更改为零
na_code<-c("nan","inf")
test<-as.data.frame(lapply(test, function(x) {
+ levels(x)[levels(x) %in% na_code] <- 0
x }) )
所以我有一个数据类型的数据框。这是正确的吗? 当我想用这个函数规范化我的数据时
normalize<-function(x){
return((x-min(x))/(max(x)-min(x)))
}
norm_test<-lapply(test, normalize)
我遇到了这个错误
Error in Summary.factor(c(2L, 1L, 2L), na.rm = FALSE) :
‘min’ not meaningful for factors
我试试这段代码
norm_test<-lapply(as.list(test), normalize)
答案 0 :(得分:1)
您可以在as.numeric
中使用lapply
,如下所示:
test<-as.data.frame(lapply(test, function(x) {
levels(x)[levels(x) %in% na_code] <- 0
as.numeric(x) }))
希望它有所帮助!
答案 1 :(得分:1)
首先,这是解决问题的一个很好的尝试 - 但我想向您介绍一些捷径。
library(tidyverse)
library(magrittr)
test %<>%
mutate_if(is.factor, funs(as.numeric(as.character(.)))) %>%
mutate_all(~if_else(is.infinite(.x) | is.nan(.x), 0, .x))
这将首先产生将无限值和NaN变为零的效果。然后,由于我们已将字符和字符的因子转换回数字,我们现在可以再次应用normalize
函数。