почему NA, введенные путем принуждения, происходят, когда я конвертирую тип данных FACTOR во фрейм данных? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть фрейм данных с 30 строк и 100 столбцов. Некоторые столбцы этих данных имеют значения «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_codes<-"inf|nan"
test<-apply(test, 2, function(x){ ifelse(x %in% na_codes, 0, x) } )


test<-as.data.frame(lapply(test, function(x) {
  levels(x)[levels(x) %in% na_code] <- 0 
  x
  })
)
но только с этим кодом я добился желаемого результата.
test<-type.convert(sub("inf|nan", 0, as.matrix(test)))

но класс мои данные меняется на фактор! когда я хочу нормализовать свои данные, я использовал этот код

normalize<-function(x){
  return((x-min(x))/(max(x)-min(x)))
}
norm_test<-sapply(data.frame(test),normalize)

сбой, возвращая следующее сообщение:

 Error in Summary.factor(766L, na.rm = FALSE) : 
  ‘min’ not meaningful for factor

Я хочу преобразовать коэффициент в числовой класс и поэтому использовал этот код

norm_test<-sapply(data.frame(as.numeric(as.character(test))),normalize)

к сожалению, это также сбой, возвращая следующее предупреждение

Warning message:
In data.frame(as.numeric(as.character(num_base))) :
  NAs introduced by coercion

На самом деле, эти коды работают хорошо для тестового образца, который я упомянул выше, и я сталкиваюсь с этими ошибками с моими данными !!!!

Мне нужно понять, почему происходит сбой и как я могу предотвратить подобные ошибки.

Большое спасибо!

1 Ответ

0 голосов
/ 30 апреля 2018

Это кажется очень запутанным способом замены NA с и Inf с. К сожалению, вы не передаете пример данных и не предоставляете подробности о функции normalize, поэтому я не уверен, как выглядят ваши данные.

В дальнейшем я предполагаю, что у вас есть matrix или data.frame со значениями numeric и некоторыми записями NA или Inf.

Как насчет этого:

# Sample data
set.seed(2017);
df <- matrix(rnorm(20), ncol = 4);
df[2, 2] <- Inf;
df[3, 3] <- NA;

# Replace NAs and Infs with 0
df[is.na(df) | is.infinite(df)] <- 0;
df;
#            [,1]         [,2]       [,3]       [,4]
#[1,]  1.43420148  0.451905527  0.3427681  1.1944265
#[2,] -0.07729196  0.000000000  1.5724254 -0.4820681
#[3,]  0.73913723 -0.001524259  0.0000000  1.3178624
#[4,] -1.75860473 -0.265336001  0.3066498 -1.1298316
#[5,] -0.06982523  1.563222619 -1.4304858 -0.9263514
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...