Сделать столбец даты из столбца непрерывного месяца - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть фрейм данных примерно так:

df<- data.frame( month= c(rep(1,10), rep(2, 10), rep(3,10)),  
                      div= sample(1:20, 30,replace=TRUE))

Я хотел бы создать столбец date, в котором каждый уровень столбца month сопоставляется с датой.Допустим, месяц 1 соответствует январю 2012 года, а месяц 3 - март 2012 года. Полученный фрейм данных должен выглядеть следующим образом:

result<- data.frame( month= c(rep(1,10), rep(2, 10), rep(3,10)),  
             date= c(rep("2012-01", 10), rep("2012-02", 10), rep("2012-03", 10)),
             div= sample(1:20, 30,replace=TRUE))

Я пытался:

date<- seq(from = as.Date("2012-01-01"), to = as.Date("2012-3-01"), by = 'month')

my_data<- merge(df$month, date)

Однаковыход положил почему-то до 90 рядов.

1 Ответ

0 голосов
/ 03 декабря 2018

Используя dplyr, вы можете сделать:

df %>%
 mutate(date = paste("2012", month, sep = "-"))

   month div   date
1      1  12 2012-1
2      1  18 2012-1
3      1   9 2012-1
4      1   5 2012-1
5      1  11 2012-1
6      1   2 2012-1
7      1  14 2012-1
8      1  15 2012-1
9      1   5 2012-1
10     1   4 2012-1
11     2  18 2012-2

Предполагая, что все последующие месяцы с 2012-1 покрыты, используя dplyr и data.table, вы можете попробовать это:

df %>%
 mutate(temp = rleid(month)) %>%
 arrange(month, temp) %>% 
 group_by(month) %>%
 mutate(temp2 = rleid(temp) - 1,
        year = paste(ifelse(temp2 == 0, 2012, 2012 + temp2), month, sep = "-")) %>%
 select(-temp, -temp2)

   month   div year  
   <dbl> <int> <chr> 
 1    1.    11 2012-1
 2    1.     1 2012-1
 3    1.     3 2012-1
 4    1.    14 2013-1
 5    1.    16 2013-1
 6    1.    14 2013-1
 7    2.     4 2012-2
 8    2.     7 2012-2
 9    2.     8 2012-2
10    3.    18 2012-3

Пример данных:

df <- data.frame(month = c(rep(1, 3), rep(2, 3), rep(3, 3), rep(4, 3),rep(5, 3),
                          rep(6, 3), rep(7, 3), rep(8, 3), rep(9, 3), rep(10, 3),
                          rep(11, 3), rep(12, 3), rep(1, 3)), 
                 div = sample(1:20, 39, replace=TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...