多个字符串替换,小数到四分之一

Multiple string replacement, decimals to quarters

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

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
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

这是一个快速修复:

 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 格式化数字来轻松解决。

还有一个动物园功能:

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
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

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

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

dyplrtidyr 的解决方案:

  1. format
  2. 的进一步处理准备小数
  3. separatemutate 以及 -Q1-Q4
  4. 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