group_by和lag不适用于长格式的日期

bwleehnv  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个很长的历史数据,格式如下(不平衡)。虽然在数据发布之前(下一个工作日)会有一个滞后,但我希望记录发生日期。我尝试使用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))

先谢谢你了。

4xrmg8kj

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(当前是字符值,不是日期格式)。

library(tidyverse)

df %>%
  ungroup() %>%
  distinct(date) %>%
  mutate(cob = lag(date)) %>%
  right_join(df) %>%
  select(date, code, due_date, ave_price, cob)
    • 产出**
date          code due_date   ave_price cob       
  <chr>        <int> <chr>          <dbl> <chr>     
1 2002-08-06 2870075 2002-08-20      100. NA        
2 2002-08-06 3000075 2002-09-10      100. NA        
3 2002-08-07 2870075 2002-08-20      100. 2002-08-06
4 2002-08-07 3000075 2002-09-10      100. 2002-08-06
5 2002-08-09 2870075 2002-08-20      100. 2002-08-07
6 2002-08-09 3000075 2002-09-10      100. 2002-08-07

相关问题