我有一个很长的历史数据,格式如下(不平衡)。虽然在数据发布之前(下一个工作日)会有一个滞后,但我希望记录发生日期。我尝试使用dplyr如下:
dataframe<-dataframe%>%group_by(date)%>%mutate(cob=lag(date,n=1))
但是,它只会产生相同的结果:
lag(date,1)
| 日期|姓名|价值|
| - ------|- ------|- ------|
| 2023年1月2日|项目a|十|
| 2023年1月2日|b.人口基金|十|
| 2023年1月2日|(c)秘书长的报告|十|
| 2023年1月3日|项目a|十|
| 2023年1月3日|b.人口基金|十|
| 2023年1月4日|项目a|十|
| 2023年1月4日|b.人口基金|十|
| 2023年1月5日|项目a|十|
| 2023年1月5日|b.人口基金|十|
| 2023年1月5日|(c)秘书长的报告|十|
我想过:
dataframe<-dataframe%>%group_by(name)%>%mutate(cob=lag(date,n=1))
但当某个样本没有观察结果时,它产生NA。mutate(cob=date-1)
不考虑工作日。
我只想将dataframe $date中的所有日期滑动1个工作日。
我附上了实际数据的一部分(日本国库券的历史价格)。
structure(list(date = c("2002-08-06", "2002-08-06", "2002-08-07",
"2002-08-07", "2002-08-09", "2002-08-09"), code = c(2870075L,
3000075L, 2870075L, 3000075L, 2870075L, 3000075L), due_date = c("2002-08-20",
"2002-09-10", "2002-08-20", "2002-09-10", "2002-08-20", "2002-09-10"
), ave_price = c(99.99, 99.99, 99.99, 99.99, 99.99, 99.99)), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L), groups = structure(list(
date = c("2002-08-06", "2002-08-07", "2002-08-09"), .rows = structure(list(
1:2, 3:4, 5:6), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -3L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE))
预期成果如下:
structure(list(date = c("2002-08-06", "2002-08-06", "2002-08-07",
"2002-08-07", "2002-08-09", "2002-08-09"), code = c(2870075L,
3000075L, 2870075L, 3000075L, 2870075L, 3000075L), due_date = c("2002-08-20",
"2002-09-10", "2002-08-20", "2002-09-10", "2002-08-20", "2002-09-10"
), ave_price = c(99.99, 99.99, 99.99, 99.99, 99.99, 99.99), cob = c(NA,
NA, "2002-08-06", "2002-08-06", "2002-08-07", "2002-08-07")), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L), groups = structure(list(
date = c("2002-08-06", "2002-08-07", "2002-08-09"), .rows = structure(list(
1:2, 3:4, 5:6), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -3L), .drop = TRUE))
先谢谢你了。
1条答案
按热度按时间4xrmg8kj1#
如果我没理解错的话,您希望在
date
列中记录的前一个日期为cob
,因此,Aug 9行将在cob
列中记录的前一个日期为Aug 7。如果是这样,您可以尝试以下操作。首先,上面的示例数据是分组的,所以我从
ungroup
开始。您可以获得唯一日期或distinct
日期的向量,并获得这些日期的lag
或之前的日期。在本例中,8月6日、7日和9日将cob
设置为NA、8月6日和8月7日。然后,您可以使用
right_join
连接回原始数据。最终的select
将保留列并包含所需的顺序。我没有理会
date
(当前是字符值,不是日期格式)。