R не может преобразовать NaN в NA для большого фрейма данных

У меня есть набор данных приличного размера из ~ 60 столбцов, которые были случайно заполнены NaN вместо NA. Типы столбцов представляют собой сочетание символьных, числовых, факторных и целых чисел. Мне нужно преобразовать NaN в NA, так как они портят работу над несколькими функциями, включая линейную регрессию. Я знаю, как изменить отдельный столбец из этого вопроса здесь:

R не может преобразовать NaN в NA

но мне любопытно, есть ли способ сделать это для полного фрейма данных без потери векторных типов. Есть предложения или это ручная работа?


r nan na
person screechOwl    schedule 07.03.2012    source источник
comment
Возможно, это мелочно с моей стороны, но я заметил, что вы не приняли ни один из предложенных ответов на этот вопрос.   -  person IRTFM    schedule 08.03.2012
comment
@DWin: Вы правы, спасибо за напоминание.   -  person screechOwl    schedule 08.03.2012


Ответы (3)


Будет ли это работать? (Это должно быть для числовых, целых, символьных и факторных векторов.)

as.data.frame( lapply(dat, function(col) {
                 if (is.numeric(col)) { is.na(col) <- is.nan(col); return(col)} else {
                 if (is.character(col) || is.factor(col) )  {
                                              is.na(col) <- col == "NaN"; return(col)} else {
                 return(col)                                                                }
                                                                                     }
                                          }
               )

dat <- 
structure(list(tester1 = structure(c(1L, 1L, 2L, 3L, 1L, 2L, 
4L), .Label = c("2", "3", "4", "NaN"), class = "factor"), tester2 = c(2, 
2, 3, 4, 2, 3, NaN)), .Names = c("tester1", "tester2"), row.names = c(NA, 
-7L), class = "data.frame")

# Produced:

  tester1 tester2
1       2       2
2       2       2
3       3       3
4       4       4
5       2       2
6       3       3
7    <NA>      NA
person IRTFM    schedule 08.03.2012

Бы

gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
     fixed = FALSE, useBytes = FALSE)

Работа?

Возможно, вам понадобится микс с apply. Не могли бы вы привести небольшой пример, чтобы я мог попытаться реализовать его?

Спасибо.

person aatrujillob    schedule 07.03.2012

Используя приведенный выше образец набора данных. Попробуй это:

CMBv = colnames(dat)

dat[CMBv] = lapply(dat[CMBv], function(x){ifelse(is.nan(x), NA,x)} )
person user4639132    schedule 06.03.2015