Заменить NA на "", но только в символьных столбцах - PullRequest
0 голосов
/ 11 мая 2018

У меня большой набор данных с ~ 200 столбцами разных типов. Мне нужно заменить NA значения на "", но только в символьных столбцах.

Использование фиктивной таблицы данных

DT <- data.table(x = c(1, NA, 2),
                y = c("a", "b", NA))

> DT
    x    y
1:  1    a
2: NA    b
3:  2 <NA>

> str(DT)
Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ x: num  1 NA 2
 $ y: chr  "a" "b" NA

Я пробовал следующий цикл for с условием, но он не работает.

for (i in names(DT)) {
  if (class(DT$i) == "character") {
    DT[is.na(i), i := ""]
  }
}

Цикл работает без ошибок, но не меняет DT.

Ожидаемый вывод, который я ищу, таков:

    x y
1:  1 a
2: NA b
3:  2  

Решение не обязательно должно включать цикл, но я не мог придумать один.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018
DT[,  lapply(.SD, function(x){if(is.character(x)) x[is.na(x)] <-  ' '; x})]

Или, если вам не нравится печатать function(x)

library(purrr)
DT[,  map(.SD, ~{if(is.character(.x)) .x[is.na(.x)] <-  ' '; .x})]

заменить

DT[, names(DT) :=  map(.SD, ~{if(is.character(.x)) .x[is.na(.x)] <-  ' '; .x})]
0 голосов
/ 11 мая 2018

Один вариант, если вы не возражаете против использования dplyr :

na_to_space <- function(x) ifelse(is.na(x)," ",x)
> DT %>% mutate_if(.predicate = is.character,.funs = na_to_space)
   x y
1  1 a
2 NA b
3  2  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...