从连续月份的列中创建日期列

时间:2018-12-03 20:28:27

标签: r dataframe

我有一个像这样的数据框:

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年1月,第3个月对应于2012年3月,则结果数据框应如下所示:

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 :(得分:0)

您可以使用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

假设使用dplyrdata.table涵盖了2012-1年以后的所有月份,则可以尝试以下操作:

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