如何解决在R中构造时间戳数据的每月快照
我遇到的一个小问题。理想的示例在这里:
我有一个数据框,用于记录对保险单value
进行更改的日期。看起来像这样:
df <- data.frame(policy_no = c(1,1,2,2),date_stamp = as.Date(c("2020-01-15","2020-04-03","2020-05-31","2020-07-22","2020-01-05","2020-03-17","2020-06-04" )),value = c(1000,2000,3000,500,1000,500))
我有两个策略,policy_no
1和2。对于每个策略,我想写一点代码来告诉我value
项自第一天起的状态每个月。所以我的输出看起来像
df_output <- data.frame(policy_no = c(rep(1,8),rep(2,8)),as_at_date = c(seq(as.Date("2020-01-01"),by = "month",length.out = 8),seq(as.Date("2020-01-01"),length.out = 8)),value = c(NA,NA,500))
很明显,我可以编写一个循环来执行此操作(对于每个policy_no
,每个as_at_date
,请给我value
以获取最近的快照,其中date_stamp <= as_at_date
)但这会很慢且笨拙。我可以通过某种方式对此进行矢量化吗?
tidyverse
的方法尤其受到欢迎,但无论如何,感谢任何建议。
非常感谢。
解决方法
这是一种方法。首先,为每个策略创建一个月度日期序列。然后,//sales of user
object = Calculate.new(user)
object.total_sales
//sales of admin
object = Calculate.new(admin)
object.total_sales
同时使用政策和每月日期,并仅过滤日期戳之后的那些每月日期。最后,使用group_by
获取包含最新值的最后一行数据。让我知道这是否是您的想法。
slice
如果您想在1月加入library(tidyverse)
library(lubridate)
df %>%
group_by(policy_no) %>%
mutate(as_at_date = list(seq(floor_date(min(date_stamp),unit = "month"),ceiling_date(max(date_stamp),by = "month"))) %>%
unnest(cols = as_at_date) %>%
group_by(policy_no,as_at_date) %>%
filter(as_at_date > date_stamp) %>%
slice(tail(row_number(),1))
,则可以加入日期序列,因此将包括所有月份:
NA
输出
df_dates <- df %>%
group_by(policy_no) %>%
mutate(as_at_date = list(seq(floor_date(min(date_stamp),by = "month"))) %>%
unnest(cols = as_at_date)
df_dates %>%
group_by(policy_no,1)) %>%
right_join(df_dates %>% select(policy_no,as_at_date) %>% distinct()) %>%
arrange(policy_no,as_at_date)
,
编辑:更新了按政策和月份对df进行排序 请在下面找到解决方案:
df <- data.frame(policy_no = c(1,1,2,1),date_stamp = as.Date(c("2020-01-15","2020-04-03","2020-05-31","2020-07-22","2020-01-05","2020-03-17","2020-06-04","2020-03-01","2020-02-01","2020-01-01","2020-01-01" )),value = c(1000,2000,3000,500,1000,500))
df$date <- format(as.Date(df$date_stamp,format="%Y-%m-%d"),format = "%d")
df$month <- format(as.Date(df$date_stamp,format = "%m")
df_temp <- df[df$date == "01",]
df_temp <- df_temp[order(df_temp$policy_no,df_temp$month),1:3]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。