这个问题之前已经为R回答过了。我想完全这样做,但要使用pyspark。
对的最新事件编制索引
last_event_index <- cumsum(df$event) + 1
将其向右移动一
last_event_index <- c(1, last_event_index[1:length(last_event_index) - 1])
获取事件的日期并用CCD_ 1对向量进行索引,#添加了一个NA作为第一个日期,因为没有事件
last_event_date <- c(as.Date(NA), df[which(df$event==1), "date"])[last_event_index]
#将事件的日期减去最后一个事件的日期
df$tae <- df$date - last_event_date
df
| date |event | tae|
|-------------|------|-------|
|#1 2000-07-06| 0| NA days
|#2 2000-09-15| 0| NA days
|#3 2000-10-15| 1| NA days
|#4 2001-01-03| 0| 80 days
|#5 2001-03-17| 1| 153 days
|#6 2001-05-23| 1| 67 days
|#7 2001-08-26| 0| 95 days
使用Windowlast
函数获取上一个事件日期,然后获取具有当前行日期的datediff
:
from pyspark.sql import functions as F, Window
w = Window.orderBy("date").rowsBetween(Window.unboundedPreceding, -1)
result = df.withColumn(
"last_event_date",
F.last(F.when(F.col("event") == 1, F.col("date")), ignorenulls=True).over(w)
).withColumn(
"tae",
F.concat(
F.coalesce(F.datediff("date", "last_event_date"), F.lit("NA")),
F.lit(" days")
)
).drop("last_event_date")
result.show()
#+----------+-----+--------+
#| date|event| tae|
#+----------+-----+--------+
#|2000-07-06| 0| NA days|
#|2000-09-15| 0| NA days|
#|2000-10-15| 1| NA days|
#|2001-01-03| 0| 80 days|
#|2001-03-17| 1|153 days|
#|2001-05-23| 1| 67 days|
#|2001-08-26| 0| 95 days|
#+----------+-----+--------+