使用R,如何根据另一列中的日期将类别分配到新列中,并将该值结转到下一个日期



我有一个大约有300万行的数据帧。每一行都分配了一个唯一的ID,最多有4个日期。我希望为月份和年份(即1月21日、2月21日和3月21日等(创建一组新列;0";对于第一日期之前的每个月/年;1〃;对于包含每个ID的日期的月份/年份;1〃;在随后的每个月/年列中,直到与第2个日期匹配的下一列。

我知道用例子来帮助我更容易,所以我把这个dput输出和我当前数据的一个例子放在一起:

structure(list(id = c(1, 2, 3, 4, 5), date1 = structure(c(1623801600, 
1615420800, 1654560000, 1620259200, 1615248000), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), date2 = structure(c(1629158400, 1621987200, 
1658448000, 1623974400, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
date3 = structure(c(NA, 1630454400, 1662076800, 1647907200, 
NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), date4 = structure(c(NA, 
1639008000, NA, NA, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

这就是我想要的样子:

structure(list(id = c(1, 2, 3, 4, 5), `Mar-21` = c(0, 1, 0, 0, 
1), `Apr-21` = c(0, 1, 0, 0, 1), `May-21` = c(0, 2, 0, 1, 1), 
`Jun-21` = c(1, 2, 0, 2, 1), `Jul-21` = c(1, 2, 0, 2, 1), 
`Aug-21` = c(2, 2, 0, 2, 1), `Sep-21` = c(2, 3, 0, 2, 1), 
`Oct-21` = c(2, 3, 0, 2, 1), `Nov-21` = c(2, 3, 0, 2, 1), 
`Dec-21` = c(2, 4, 0, 2, 1), `Jan-22` = c(2, 4, 0, 2, 1), 
`Feb-22` = c(2, 4, 0, 2, 1), `Mar-22` = c(2, 4, 0, 3, 1), 
`Apr-22` = c(2, 4, 0, 3, 1), `May-22` = c(2, 4, 0, 3, 1), 
`Jun-22` = c(2, 4, 1, 3, 1), `Jul-22` = c(2, 4, 2, 3, 1), 
`Aug-22` = c(2, 4, 2, 3, 1), `Sep-22` = c(2, 4, 3, 3, 1)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

请注意,我有这个数据集的宽格式和长格式,以防以长格式使用它更有意义。

谢谢!

这是一个有趣的练习!我相信有十亿种方法可以更有效地做到这一点,但我认为这很有效,对我来说是一个有趣的谜题。然后,我使用展开网格将每个ID的月份组合到原始数据框中。然后我总结了有多少日期1:4比列表中的月份大。我不得不用floor_date将日期1:4改为本月1日。希望这能有所帮助!

library(dplyr)
library(lubridate)
library(tidyr)
dat2<-dat%>%
tidyr::pivot_longer(cols = -id, values_drop_na = T)
dat_min_max<-data.frame("Min" = min(dat2$value), "Max" = max(dat2$value))
month_seq<-seq(dat_min_max$Min, dat_min_max$Max+months(1), by = "month")
dat3<-dat%>%
mutate(date1 = floor_date(date1, "month"),
date2 = floor_date(date2, "month"),
date3 = floor_date(date3, "month"),
date4 = floor_date(date4, "month")
)%>%
left_join(expand.grid(dat$id, month_seq), by = c("id" = "Var1"))%>%
rowwise()%>%
mutate(c = sum(date1 <= Var2, date2 <= Var2, date3 <= Var2, date4 <= Var2, na.rm = T))%>%
mutate(Var2 = format(Var2, "%b-%y"))%>%
select(-date1, -date2, -date3, -date4)%>%
tidyr::pivot_wider(names_from = Var2, values_from = c)

相关内容

  • 没有找到相关文章

最新更新