Правильное использование str_replace и str_replace_all

#r

#r

Вопрос:

Я пытаюсь преобразовать свой столбец Fecha в столбец даты. Столбец выглядит как X13.08.2020 , и я могу удалить X , но я не могу просочиться, чтобы заменить . на - . Следующим шагом было бы использовать as.Date() в mutate() функции.

 dat %>% 
  mutate(Fecha = str_replace_all(Fecha, "X", ""),
         Fecha = str_replace(Fecha, ".", "-"))
  

Приведенный выше код дает мне:

 # A tibble: 68 x 2
   Fecha      `Total acumulado de casos confirmados desde el inicio (31-01-2020)`
   <chr>                                                                    <int>
 1 -3.08.2020                                                               25044
 2 -2.08.2020                                                               24512
 3 -1.08.2020                                                               24140
  

Где начальные нули удалены, а точка — нет.

Данные:

 dat <- structure(list(Fecha = c("X13.08.2020", "X12.08.2020", "X11.08.2020", 
"X10.08.2020", "X09.08.2020", "X06.08.2020", "X05.08.2020", "X04.08.2020", 
"X03.08.2020", "X02.08.2020", "X30.07.2020", "X29.07.2020", "X28.07.2020", 
"X27.07.2020", "X26.07.2020", "X23.07.2020", "X22.07.2020", "X21.07.2020", 
"X20.07.2020", "X19.07.2020", "X16.07.2020", "X15.07.2020", "X14.07.2020", 
"X13.07.2020", "X12.07.2020", "X09.07.2020", "X08.07.2020", "X07.07.2020", 
"X06.07.2020", "X05.07.2020", "X02.07.2020", "X01.07.2020", "X30.06.2020", 
"X29.06.2020", "X28.06.2020", "X27.06.2020", "X26.06.2020", "X25.06.2020", 
"X24.06.2020", "X23.06.2020", "X22.06.2020", "X21.06.2020", "X20.06.2020", 
"X19.06.2020", "X18.06.2020", "X17.06.2020", "X16.06.2020", "X15.06.2020", 
"X14.06.2020", "X13.06.2020", "X12.06.2020", "X11.06.2020", "X10.06.2020", 
"X09.06.2020", "X08.06.2020", "X07.06.2020", "X06.06.2020", "X05.06.2020", 
"X04.06.2020", "X03.06.2020", "X02.06.2020", "X01.06.2020", "X31.05.2020", 
"X30.05.2020", "X29.05.2011", "X28.05.2020", "X27.05.2020", "X26.05.2020"
), `Total acumulado de casos confirmados desde el inicio (31-01-2020)` = c(25044L, 
24512L, 24140L, 23761L, 23505L, 22835L, 22423L, 22240L, 21921L, 
21752L, 21190L, 21063L, 20787L, 20650L, 20498L, 20121L, 19975L, 
19848L, 19757L, 19652L, 19420L, 19357L, 19274L, 19208L, 19140L, 
19036L, 18965L, 18898L, 18839L, 18771L, 18676L, 18600L, 18497L, 
18413L, 18300L, 18248L, 18225L, 18181L, 18077L, 18032L, 17970L, 
17913L, 17869L, 17854L, 17765L, 17697L, 17599L, 17530L, 17473L, 
17424L, 17408L, 17317L, 17197L, 17072L, 16979L, 16883L, 16790L, 
16756L, 16681L, 16575L, 16442L, 16342L, 16200L, 16133L, 16113L, 
16042L, 15906L, 15786L)), row.names = c(NA, -68L), class = c("tbl_df", 
"tbl", "data.frame"))
  

Ответ №1:

Мы можем использовать метасимвол fixed as . , который соответствует любому символу или escape ( \ ), или поместить его в квадратную скобку ( [.] )

 library(dplyr)
library(stringr)
dat %>%
     dplyr::mutate(Fecha = str_remove(Fecha, "^X"),
                   Fecha = str_replace_all(Fecha, fixed("."), "-"))
  

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

1. Спасибо. Я изменил str_replace на str_replace_all , и это сработало. Что fixed() здесь означает?

2. @user8959427 это говорит о том, что . следует буквально оценивать как . , а не в значении его метасимвола

Ответ №2:

РЕДАКТИРОВАТЬ: упс… Я думал, что это был PHP : (

Лучше использовать встроенный класс DateTime из php. Чтобы вы могли легко манипулировать этим (изменять формат, часовой пояс, интервал и т.д.). Красота 🙂

 $mydate = DateTimeImmutable::createFromFormat('Xd.m.Y', "X30.05.2020");
echo $mydate->format('Y-m-d');
  

Ответ №3:

Другой способ, который вы можете попробовать

 library(tidyverse)
library(stringr)
df2 <- dat %>% 
  mutate(Fecha2 = as.Date(str_replace_all(Fecha, c("^X" = "", "\." = "-")), format = "%d-%m-%Y"))

str(df2)
# tibble [68 x 3] (S3: tbl_df/tbl/data.frame)
# $ Fecha                                                            : chr [1:68] "X13.08.2020" "X12.08.2020" "X11.08.2020" "X10.08.2020" ...
# $ Total acumulado de casos confirmados desde el inicio (31-01-2020): int [1:68] 25044 24512 24140 23761 23505 22835 22423 22240 21921 21752 ...
# $ Fecha2                                                           : Date[1:68], format: "2020-08-13" "2020-08-12" "2020-08-11" ...