Преобразование символа в числовое без приведения NA в R

Я работаю в R и у меня есть датафрейм, dd_2006, с числовыми векторами. Когда я впервые импортировал данные, мне нужно было удалить $, десятичные точки и некоторые пробелы из 3 моих переменных: SumOfCost, SumOfCases и SumOfUnits. Для этого я использовалstr_replace_all, Однако однажды я использовалstr_replace_allвекторы были преобразованы в символы. Поэтому я использовал as.numeric (var) для преобразования векторов в числовые, но были введены NA, хотя, когда я запускал код ниже, ДО ТОГО, как я запускал as.numeric, в векторах не было NA.

sum(is.na(dd_2006$SumOfCost))
[1] 0
sum(is.na(dd_2006$SumOfCases))
[1] 0
sum(is.na(dd_2006$SumOfUnits))
[1] 0

Вот мой код после импорта, начиная с удаления $ из вектора. вstr(dd_2006) вывод, я удалил некоторые переменные ради пространства, поэтому столбец # вstr_replace_all приведенный ниже код не соответствует выводу, который я разместил здесь (но он соответствует исходному коду):

library("stringr")
dd_2006$SumOfCost <- str_sub(dd_2006$SumOfCost, 2, ) #2=the first # after the $

#Removes decimal pt, zero's after, and commas
dd_2006[ ,9] <- str_replace_all(dd_2006[ ,9], ".00", "")
dd_2006[,9] <- str_replace_all(dd_2006[,9], ",", "")

dd_2006[ ,10] <- str_replace_all(dd_2006[ ,10], ".00", "")
dd_2006[ ,10] <- str_replace_all(dd_2006[,10], ",", "")

dd_2006[ ,11] <- str_replace_all(dd_2006[ ,11], ".00", "")
dd_2006[,11] <- str_replace_all(dd_2006[,11], ",", "")

str(dd_2006)
'data.frame':   12604 obs. of  14 variables:
 $ CMHSP                     : Factor w/ 46 levels "Allegan","AuSable Valley",..: 1 1 1
 $ FY                        : Factor w/ 1 level "2006": 1 1 1 1 1 1 1 1 1 1 ...
 $ Population                : Factor w/ 1 level "DD": 1 1 1 1 1 1 1 1 1 1 ...
 $ SumOfCases                : chr  "0" "1" "0" "0" ...
 $ SumOfUnits                : chr  "0" "365" "0" "0" ...
 $ SumOfCost                 : chr  "0" "96416" "0" "0" ...

Я нашел ответ на похожий вопрос к моемуВот, используя следующий код:

# create dummy data.frame
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)

Давайте взглянем на data.frame

> d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5

и давайте побежим

> sapply(d, mode)
       char   fake_char         fac    char_fac         num 
"character" "character"   "numeric"   "numeric"   "numeric" 
> sapply(d, class)
       char   fake_char         fac    char_fac         num 
"character" "character"    "factor"    "factor"   "integer" 

Теперь вы, вероятно, спрашиваете себя "Где аномалия?" Ну, я столкнулся с довольно странными вещами в R, и это не самая смущающая вещь, но это может сбить вас с толку, особенно если вы прочитаете это перед тем, как лечь в постель.

Здесь идет: первые два столбца являются символами. Я сознательно назвал 2-й один fake_char. Найдите сходство этой символьной переменной с той, которую Дирк создал в своем ответе. Это на самом деле числовой вектор, преобразованный в символ. 3-й и 4-й столбцы являются факторами, а последний - «чисто» числовым.

Если вы используете функцию преобразования, вы можете преобразовать fake_char в число, но не саму переменную char.

> transform(d, char = as.numeric(char))
  char fake_char fac char_fac num
1   NA   ,      1   1        a   1
2   NA         2   2        b   2
3   NA         3   3        c   3
4   NA         4   4        d   4
5   NA         5   5        e   5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
but if you do same thing on fake_char and char_fac, you'll be lucky, and get away with no NA's:

transform (d, fake_char = as.numeric (fake_char), char_fac = as.numeric (char_fac))

  char fake_char fac char_fac num
1    a         1   1        1   1
2    b         2   2        2   2
3    c         3   3        3   3
4    d         4   4        4   4
5    e         5   5        5   5

Таким образом, я попробовал приведенный выше код в своем скрипте, но все еще придумал NA (без предупреждения о принуждении).

#changing sumofcases, cost, and units to numeric
dd_2006_1 <- transform(dd_2006, SumOfCases = as.numeric(SumOfCases), SumOfUnits = as.numeric(SumOfUnits), SumOfCost = as.numeric(SumOfCost))

> sum(is.na(dd_2006_1$SumOfCost))
[1] 12
> sum(is.na(dd_2006_1$SumOfCases))
[1] 7
> sum(is.na(dd_2006_1$SumOfUnits))
[1] 11

Я также использовалtable(dd_2006$SumOfCases) и т.д., чтобы посмотреть на наблюдения, чтобы увидеть, есть ли какие-либо символы, которые я пропустил в наблюдениях, но их не было. Есть мысли о том, почему появляются НС и как от них избавиться?

Ответы на вопрос(3)

Ваш ответ на вопрос