как подавить замену NA при преобразовании в числовое? - PullRequest
0 голосов
/ 04 марта 2020

допустим, у меня есть следующие данные:

dput(mydata)
structure(list(a = c("20", "30", "25", ".", ".", ".", ".", ".", 
".", "25", "0", "1"), b = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 
1), c = c(1, 2, 3, 5, 2, 1, 2, 3, 1, 3, 1, 3), d = c(5, 2, 3, 
1, 3, 13, 1, 3, 1, 31, 2, 1)), row.names = c(NA, 12L), class = "data.frame")

Затем я хочу применить код, преобразующий все столбцы из символьных в числовые.

mydata_convert <- mydata %>% mutate_if(is.character, as.numeric)

Проблема в том, что все "." значения были заменены NA.

Предупреждающее сообщение: NA введены по принуждению

Не могли бы вы посоветовать, как сохранить исходные значения (чтобы эти значения не путать с уже существующими NA? ) и отмените замену NA при применении этого кода:

mydata_convert <- mydata %>% mutate_if(is.character, as.numeric)

Заранее благодарим за помощь

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Использование ifelse:

mydata %>% 
  mutate_if(is.character, ~ ifelse(. == ".", 0, .) %>% as.numeric)

#      a b c  d
#  1  20 1 1  5
#  2  30 1 2  2
#  3  25 1 3  3
#  4   0 0 5  1
#  5   0 0 2  3
#  6   0 0 1 13
#  7   0 0 2  1
#  8   0 0 3  3
#  9   0 0 1  1
#  10 25 1 3 31
#  11  0 1 1  2
#  12  1 1 3  1
3 голосов
/ 04 марта 2020

Следующий код сначала заменяет "0.0" на одну точку ".", а затем приводит к нумерации c.

library(dplyr)

mydata %>% 
  mutate_if(is.character, list(function(x) sub("^\\.$", "0.0", x))) %>%
  mutate_if(is.character, as.numeric)
#    a b c  d
#1  20 1 1  5
#2  30 1 2  2
#3  25 1 3  3
#4   0 0 5  1
#5   0 0 2  3
#6   0 0 1 13
#7   0 0 2  1
#8   0 0 3  3
#9   0 0 1  1
#10 25 1 3 31
#11  0 1 1  2
#12  1 1 3  1
...