разделение строк месяца / года в r на `-` - PullRequest
2 голосов
/ 05 апреля 2019

У меня есть следующий столбец:

   fiscal_year_end
1             1231
2             1231
3             1231
4             1231
5              202
6             1231
7             1231
8              202
9             1231
10             927

Они соответствуют месяцам, т.е. 12-31, 9-27 и 20-2.

Я пытаюсь перевести их в этот формат, но не могу понять, что это правильно.

Я пробовал str_replace_all(df$fiscal_year_end, "(?<=^\\d{2}|^\\d{4})", "-") с использованием пакета stringr, но он не выходит так, как я ожидаю.

Где я здесь не так?

Данные:

structure(list(fiscal_year_end = c(1231L, 1231L, 1231L, 1231L, 
202L, 1231L, 1231L, 202L, 1231L, 927L, 228L, 1231L, 1231L, 1231L, 
1231L, 928L, 1231L, 1231L, 930L, 1231L, 1231L, 628L, 1231L, 1231L, 
1228L, 930L, 1231L, 1231L, 1231L, 1231L, 927L, 630L, 1231L, 202L, 
1231L, 1231L, 1231L, 1231L, 927L, 930L, 1231L, 1231L, 1231L, 
1231L, 228L, 928L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 
1231L, 1231L, 1231L, 1231L, 1228L, 1231L, 1231L, 1231L, 1231L, 
131L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 930L, 1231L, 
1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 831L, 1231L, 102L, 
1231L, 1231L, 1231L, 1130L, 1231L, 1228L, 1231L, 1231L, 1231L, 
1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 930L, 1031L, 1231L, 
1231L, 1231L, 1231L, 1231L, 1231L, 203L, 1231L, 1231L, 1231L, 
1231L, 1231L, 1229L, 1231L, 1231L, 1231L, 426L, 1231L, 1231L, 
1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 202L, 1231L, 
1231L, 1231L, 1231L, 1231L, 1231L, 1229L, 1231L, 1231L, 630L, 
1231L, 1231L, 1209L, 1231L, 1231L, 1231L, 728L, 1231L, 1231L, 
1231L, 1231L, 1231L, 1231L, 630L, 1231L, 1231L, 1231L, 1231L, 
1231L, 1231L, 727L, 1231L, 201L, 1231L, 1231L, 1231L, 1231L, 
1231L, 630L, 1231L, 1231L, 1231L, 1130L, 1231L, 1231L, 1231L, 
1231L, 1231L, 1231L, 1231L, 930L, 930L, 1231L, 1231L, 331L, 1231L, 
1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1031L, 1229L, 1231L, 
1231L, 1231L, 201L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 
831L, 630L, 831L)), row.names = c(NA, -200L), .internal.selfref = <pointer: 0x0000000002511ef0>, class = "data.frame")

EDIT:

     datadate fiscal_year_end
1  2012-08-31             831
2  2017-01-31             201
3  1999-12-31            1231
4  2009-02-28             228
5  2010-12-31            1231
6  2005-12-31            1231
7        <NA>             630
8  2010-09-30             928
9  2009-09-30             930
10 2018-01-31             201
11 2017-12-31            1231
12 2004-12-31            1231

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

Используя базу R, мы можем использовать sub с двумя группами захвата, где вторая часть - это число с двумя цифрами, тогда как первая часть - это все остальное.

sub("(.*)(\\d+{2}$)", "\\1-\\2", df$fiscal_year_end)

#[1] "12-31" "12-31" "12-31" "12-31" "2-02"  "12-31" "12-31" "2-02"  "12-31"
#     "9-27"  "2-28"  "12-31" ..... 
2 голосов
/ 05 апреля 2019

Другой, по общему признанию, слишком сложный способ:

res1<-ifelse(nchar(my_df$fiscal_year_end)%%2==0,substring(my_df$fiscal_year_end,1,2),
              substring(my_df$fiscal_year_end,1,1))
res2<-ifelse(nchar(my_df$fiscal_year_end)%%2==0,substring(my_df$fiscal_year_end,3,4),
             substring(my_df$fiscal_year_end,2,3))      
paste0(res1,"-",res2)

Результат:

[1] "12-31" "12-31" "12-31" "12-31" "2-02"  "12-31" "12-31" "2-02"  "12-31" "9-27" 
2 голосов
/ 05 апреля 2019

Мы можем separate после форматирования до 4-х цифр

library(dplyr)
library(tidyr)
df1 %>% 
  mutate(fiscal_year_end =  sprintf("%04d", fiscal_year_end)) %>% 
  separate(fiscal_year_end, c("month", "day"), sep= 2)

Или использовать отрицательный индекс в separate

df1 %>% 
  separate(fiscal_year_end, c("month", "day"), sep= -2)

Или используя только base R, мы используем sub, чтобы создать разделитель (используя только одну группу захвата) и преобразовать его в data.frame из двух столбцов с read.csv

out <- read.csv(text = sub("(\\d{2})$", ",\\1", df1[[1]]), header = FALSE,
       col.names = c("month", "day"), stringsAsFactors = FALSE)

head(out, 5)
#  month day
#1    12  31
#2    12  31
#3    12  31
#4    12  31
#5     2   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...