класс не изменяется в data.frame после очистки NA в R - PullRequest
2 голосов
/ 25 апреля 2020

У меня есть input data.frame, который содержит два нежелательных элемента (т.е. "#N/A",'p') в нем. Я чищу и заменяю элементы на NA.

Затем я удаляю все строки с NA, чтобы получить полностью чистый data.frame с ТОЛЬКО первым (id) и последним (read_2018) столбцами, состоящими только из чисел.

Вопрос: ПОЧЕМУ ИМХО класс id и read_2018 является фактором? Как исправить это автоматически для любого data.frame ФУНКЦИОНАЛЬНЫМ способом (например, используя loop)?!

То есть после полной очистки я хочу, чтобы любой столбец, состоящий из ВСЕХ чисел, стал класса цифра c, все, что является символом ВСЕ, становится символом класса et c.?

input <- data.frame(id = c(1,"#N/A",3, 4), school = LETTERS[1:4], read_2018 =c("#N/A",'p',9, 8))

sapply(input, class)  ## check class of all columns

 #>      id    school read_2018 
 #>  "factor"  "factor"  "factor"

  replace = c("#N/A", 'p')     # Unwanted elements to be replaced
  with = NA                    # with `NA`

 input[sapply(input, `%in%`, replace)] <- with ## Now replace unwanted elements with `NA`

 input <- na.omit(input)   ## Remove all rows with `NA`

 sapply(input, class)      ## class of clean `input` without `NA` or character elements

 #>     id      school  read_2018     ###@@@ WHY STILL class of id and read_2018 is factor? How to fix?!
 #>  "factor"  "factor"  "factor"

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Как только вы удалите ненужные данные, классы не будут автоматически меняться.

Вы можете использовать type.convert, который преобразует данные в соответствующий класс.

input <- type.convert(input, as.is = TRUE)
sapply(input, class)

#        id      school   read_2018 
#  "integer" "character"   "integer" 
1 голос
/ 25 апреля 2020

Мы можем использовать map, чтобы получить класс

input <- type.convert(input, as.is = TRUE)

Если у нас есть предыдущая версия R, то есть версия R <3.5 или около того, сделайте </p>

input[] <- lapply(input, function(x) type.convert(as.character(x), as.is = TRUE))

затем с map получите class

library(purrr)
map_chr(input, class)

или base R с lapply и unlist

unlist(lapply(input, class))
...