【问题标题】:Multiple string replacement, decimals to quarters多个字符串替换,小数到四分之一
【发布时间】:2021-06-01 07:13:42
【问题描述】:

我想用-Q1替换.00,用-Q2替换.25,用-Q3替换.50,用.75替换.75,如下所示。但是,我的代码没有按预期工作。有什么提示吗?

library(tidyverse)

dt1 <- 
  tibble(Date = c(2015.00, 2015.25, 2015.50, 2015.75))

dt1
# A tibble: 4 x 1
   Date
  <dbl>
1 2015 
2 2015.
3 2016.
4 2016.

dt1 %>% 
  pull(Date)

[1] 2015.00 2015.25 2015.50 2015.75

dt1 %>% 
  mutate(Date1 = str_replace_all(string = Date, pattern = c(".00" = "-Q1", ".25" = "-Q2", ".50" = "-Q3", ".75" = "-Q4")))

# A tidytable: 4 × 2
   Date Date1  
  <dbl> <chr>  
1 2015  2015   
2 2015. 2015-Q2
3 2016. 2015.5 
4 2016. 2015-Q4

【问题讨论】:

    标签: r tidyverse stringr


    【解决方案1】:

    还有一个动物园功能:

    library(tidyverse)
    library(zoo)
    
    dt1 <- 
      tibble(Date = c(2015.00, 2015.25, 2015.50, 2015.75))
    
    dt1 %>%
      mutate(Date1 = format.yearqtr(Date, format = "%Y.Q%q") )
    
    # Date Date1  
    # <dbl> <chr>  
    # 1 2015  2015.Q1
    # 2 2015. 2015.Q2
    # 3 2016. 2015.Q3
    # 4 2016. 2015.Q4
    

    【讨论】:

      【解决方案2】:

      您也可以同时使用整数除法%/% 和模除法%%

      paste0(dt1$Date %/% 1, '-Q',(dt1$Date %% 1)*4 +1)
      
      [1] "2015-Q1" "2015-Q2" "2015-Q3" "2015-Q4"
      

      因此,在管道语法中使用它作为

      dt1 %>%
        mutate(date1 = paste0(Date %/% 1, '-Q',(Date %% 1)*4 +1))
      
      # A tibble: 4 x 2
         Date date1  
        <dbl> <chr>  
      1 2015  2015-Q1
      2 2015. 2015-Q2
      3 2016. 2015-Q3
      4 2016. 2015-Q4
      

      【讨论】:

        【解决方案3】:

        这里有一个快速修复:

         dt1 %>% 
          mutate(Date1 = str_replace_all(format(Date, nsmall = 2), 
                        pattern = c(".00" = "-Q1", ".25" = "-Q2", ".50" = "-Q3", ".75" = "-Q4")))
        

        问题是2015.00首先被转换为字符,此时它变成2015。因此,字符串替换失败。 您可以通过尝试as.character(2015.00) 看到这一点。

        但是,可以通过使用 format 先格式化数字来轻松解决此问题。

        【讨论】:

          【解决方案4】:
          vec <- c("00" = "-Q1", "25" = "-Q2", "50" = "-Q3", "75" = "-Q4")
          dt1 %>%
            mutate(new = paste0(Date %/% 1, vec[sprintf("%02d", Date %% 1 * 100)]))
          
             Date new    
            <dbl> <chr>  
          1 2015  2015-Q1
          2 2015. 2015-Q2
          3 2016. 2015-Q3
          4 2016. 2015-Q4
          

          【讨论】:

          • 感谢@Onyambu 的回答和解决方案。
          • Onyambu,据我所知,我们可以在这里使用switch 吗?
          • @AnilGoyal 是的,虽然这需要你编写一个函数
          • 好的,知道了。感谢您的澄清
          【解决方案5】:
          library(tidyverse)
          
          
          dt1 <- 
              as.character(c(2015.00, 2015.25, 2015.50, 2015.75))
          
          
          dt1 <- if_else(str_detect(dt1, '\\.', negate = TRUE),
                         paste0(dt1, '.00'), #If condition TRUE
                         dt1) #if condition FALSE
          
          
          value_before <- c("\\.00","\\.25","\\.5","\\.75" )
          value_after  <- c("-Q1", "-Q2","-Q3", "-Q4")
          
          tibble(Date = str_replace(dt1, value_before, value_after))
          #> # A tibble: 4 x 1
          #>   Date   
          #>   <chr>  
          #> 1 2015-Q1
          #> 2 2015-Q2
          #> 3 2015-Q3
          #> 4 2015-Q4
          

          reprex package (v2.0.0) 于 2021-06-01 创建

          【讨论】:

            【解决方案6】:

            dyplrtidyr 的解决方案:

            1. 使用format 准备小数以便进一步处理
            2. separatemutate-Q1-Q4
            3. unite
            library(tidyr)
            library(dplyr)
            dt1 %>% 
              mutate(Date = format(round(Date, digits=2), nsmall = 2)) %>% 
              separate(Date, into = c("Year", "Quarter"), remove=FALSE) %>% 
              mutate(Quarter = recode(Quarter, "00" = "-Q1", "25" = "-Q2", "50" = "-Q3", "75" = "-Q4")) %>% 
              unite("new", Year:Quarter, sep = "")
            

            输出:

              Date    new    
              <chr>   <chr>  
            1 2015.00 2015-Q1
            2 2015.25 2015-Q2
            3 2015.50 2015-Q3
            4 2015.75 2015-Q4
            

            【讨论】:

              猜你喜欢
              • 2018-11-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多