这是一种拆分-应用-组合方法,该方法为每个客户保留所有为 1 的值以及第一个 1 之前的值。
# split data by customer ID
myList <- split(df, df$Cust_ID)
# loop through ID list, drop desired rows, rbind resulting list
dfNew <- do.call(rbind, lapply(myList, function(i) {
drop <- which(i$Value==1)
i[c(1:drop[1], drop[-1]),]}))
返回
dfNew
Cust_ID Date Value
500219.1 500219 2016-04-11 12:00:00 0
500219.2 500219 2016-04-12 16:00:00 0
500219.3 500219 2016-04-14 11:00:00 1
500219.4 500219 2016-04-15 12:00:00 1
500220.7 500220 2016-04-11 12:00:00 0
500220.8 500220 2016-04-14 11:00:00 1
500220.9 500220 2016-04-15 12:00:00 1
请注意,如果客户 ID 的值永远不等于 1,则此解决方案将不起作用。
如果您想保留从未达到阈值 1 的观测值,请使用
dfNew <- do.call(rbind, lapply(myList, function(i) {
drop <- which(i$Value==1)
if(length(drop) != 0) i[c(1:drop[1], drop[-1]),]
else i}))