Сложное разделение строк

#r

Вопрос:

У меня есть фрейм данных, в котором некоторые значения для «дохода» указаны сотнями, скажем, «300», а другие указаны как «1,5 тыс.». Очевидно, это раздражает, поэтому мне нужно найти какой-то способ разделить символы «k» и «.» от этих значений и только от этих значений. Есть какие-нибудь мысли?

Комментарии:

1. x <- c('300', '1.5k'); as.numeric(gsub('k', '', x)) * ifelse(grepl('k', x), 1000, 1)

Ответ №1:

Другой способ сделать это-просто с регулярным выражением (и tidyverse для труб)

  library(tidyverse)

 string <- c("300", "1.5k")

 string %>% ifelse(
        # check if string ends in k (upper/lower case)
        grepl("[kK]$", .), 
        # if string ends in k, remove it and multiply by 1000
        1000 * as.numeric(gsub("[kK]$", "", .)), 
        .) %>% as.numeric() 

 [1]  300 1500
 

Ответ №2:

Вы можете создать функцию, которая удалит «k», изменит числовой вектор и умножит его на 1000.

 to_1000 <- function(x){
  
    x %>% 
      str_remove("k") %>% 
      as.numeric() %>% 
    {.*1000}
}


x <- c("3000","1.5k")


tibble(x) %>% 
  mutate(x_num = if_else(str_detect(x,"k"),to_1000(x),as.numeric(x)))

# A tibble: 2 x 2
  x     x_num
  <chr> <dbl>
1 3000   3000
2 1.5k   1500