Нормализация кадра данных - Ошибка: не числовой аргумент в двоичный файл - R - PullRequest
2 голосов
/ 03 мая 2019

Я прошел через подобные вопросы, но все еще не мог решить свою проблему. Тем не мение, У меня есть фрейм данных (размер: 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, что меня смущает.

Спасибо

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Вы можете проанализировать вашу функцию 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
1 голос
/ 03 мая 2019

Проблема связана с переменным классом. Проверьте класс - класс (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 )
...