我有一个像这样的数据框:
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行。
答案 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
假设使用dplyr
和data.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))