You should consider whether you really want to store revenue as text in your data. That will make it harder to do any sort of computations on revenue. You may find it better to store revenue as a float and write a custom format to display it with a suffix. The unit of measurement could be ones, billions, or anything else.
Depending on what you decide, here are two approaches using the popular "tidyverse" packages. In both approaches, use tidyr's separate(..., sep='\\s',convert=TRUE)
to split your revenue text into a number and a unit.
Keeping revenue stored as text (not best practice)
library(tidyr)
library(dplyr)
DF %>%
separate(Revenue, into=c('Rev.Amt','Rev.Denom'), sep='\\s', convert=TRUE) %>%
mutate( Rev.Amt = Rev.Amt/ifelse(Rev.Denom=='Mn',1000,1), # other conversions as needed
Rev.Denom = 'bn' ) %>%
unite(Revenue, Rev.Amt, Rev.Denom, sep=' ')
# Brands Revenue
# 1 A 50.1 bn
# 2 B 41.2 bn
# 3 C 0.0325 bn
# 4 D 15.1 bn
Store revenue as numeric (better practice)
Here we'll store revenue as units without a multiple, but you could also store it as billions and avoid the step of division upon display.
DF %<>%
separate(Revenue, into=c('Rev.Amt','Rev.Denom'), sep='\\s', convert=TRUE) %>%
mutate( Rev.Amt = Rev.Amt*ifelse(Rev.Denom=='Mn', 1e6, 1e9)) %>% # other conv as needed
select(-Rev.Denom)
# To display numeric revenue in billions
showInBn <- function(x) paste(x/1e9,'bn')
DF %>% mutate(Rev.Expr = showInBn(Rev.Amt)) %>% select(-Rev.Amt)
# Brands Rev.Expr
# 1 A 50.1 bn
# 2 B 41.2 bn
# 3 C 0.0325 bn
# 4 D 15.1 bn