Использование stringr для преобразования символьного объекта в числовой объект - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь преобразовать символьный объект, отображающий числа, в соответствующую числовую форму.Некоторые из значений объекта напоминают числа с письменными числами, например, «10 .5 миллионов» и «1.235 миллиардов».Проблема заключается в том, что число десятичных дробей действительных чисел, предшествующих записанным числам, варьируется от значения к значению.

Например: 69,40 млн., 70,1 млн., 12 млн. И т. Д.

Как простым способом преобразовать записанное число в фактическое число, чтобы оно соответствовало фактическому концептуальному числу?

Я работаю с этим кодом, пытаясь очистить столбец gross_domestic двух таблиц, но я не могу понять, как завершить это так, чтобы все это было числовым:

library(pacman)
pacman::p_load(httr, tidyverse, rvest, janitor)

grconurl <- "https://www.conservapedia.com/Essay:Greatest_Conservative_Movies"
woliburl <- "https://www.conservapedia.com/Essay:Worst_Liberal_Movies"


grcon <- read_html(grconurl)
wolib <- read_html(woliburl)

grcon_tabel <- grcon %>%
  html_node(".wikitable") %>% 
  html_table(., fill = T) %>% 
  clean_names()

wolib_table <- wolib %>%
  html_node(".wikitable") %>% 
  html_table(., fill = T) %>% 
  clean_names()

grcon_tabel$gross_domestic <- grcon_tabel$gross_domestic %>% 
  str_replace(
    pattern = ',',
    replacement = ('')) %>% 
  str_replace(
    pattern = '\\$',
    replacement = ('')
  ) %>% 
  str_replace(
    pattern = '\\[[:digit:][:digit:]]',
    replacement = ('')
  )

1 Ответ

0 голосов
/ 25 сентября 2018
library("tidyverse")

пример данных

(используя некоторые значения из вашего URL)

vals <- c("$34,543,701", "$69.40 million","$1.519 billion","junk")
dd <- tibble(vals)

transform

(dd 
  %>% mutate(vals=str_remove_all(vals,"(,|\\$|\\[.*\\]|\\(.*\\))",   ## strip extraneous chars
             multiplier=ifelse(str_detect(vals,"million"),1e6,
                          ifelse(str_detect(vals,"billion"),1e9,1)),
             vals=str_remove(vals,"(m|b)illion"),   ## drop words
            vals=as.numeric(vals)*multiplier)
  %>% select(-multiplier)                           ## drop auxiliary variable
)

Я намеренно оставил нечисловойзначение в примере (поскольку такие значения существуют в приведенном вами примере);это вызовет предупреждение от as.numeric().Вы можете использовать suppressWarnings() вокруг этого конкретного элемента в трубе ...

...