使用Stringr将字符对象转换为数字对象

时间:2018-09-25 13:03:14

标签: r stringr

我正在尝试将显示数字的字符对象转换为其适当的数字形式。对象的某些值类似于带有书面数字的数字,例如“ 1050万”和“ 12.35亿”。问题在于,写出的数字之前的实际数字的小数位数会因值而异。

例如:6940万,7010万,1200万等。

我如何轻松地将写出的数字转换为实际数字,使其与实际概念数字匹配?

我正在使用此代码尝试清理两个表的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 :(得分:1)

library("tidyverse")

示例数据

(使用您网址中的某些值)

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

转换

(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() ...