如何在 R 中的更多条件下删除行?

How can I remove rows on more conditions in R?

我有会话 ID、客户 ID、转换列以及所有具有特定日期的列。我想在最后一次购买客户后删除行。我的数据如下所示:

SessionId       ClientId        Conversion         Date
    1               1                0             05-01
    2               1                0             06-01
    3               1                0             07-01
    4               1                1             08-01
    5               1                0             09-01
    6               2                0             05-01 
    7               2                1             06-01
    8               2                0             07-01
    9               2                1             08-01
    10              2                0             09-01

作为我想要的输出:

SessionId       ClientId        Conversion         Date
    1               1                0             05-01
    2               1                0             06-01
    3               1                1             07-01
    6               2                0             05-01 
    7               2                1             06-01
    8               2                0             07-01
    9               2                1             08-01

我看起来很容易,但它有一些条件。根据client id,需要删除客户最后一次购买之后的session。我有很多观察,所以在特定日期之后删除是不可能的。当有人购买时,它需要检查每个客户 ID。

我不知道为此需要使用什么样的函数。也许是某种循环?

希望有人能帮助我。

我们可以试试

library(dplyr)
df1 %>%
     group_by(ClientId) %>%
     slice(seq_len(tail(which(Conversion == 1), 1)))

数据

df1 <- structure(list(SessionId = 1:10, ClientId = c(1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L), Conversion = c(0L, 0L, 0L, 1L, 0L, 0L, 
1L, 0L, 1L, 0L), Date = c("05-01", "06-01", "07-01", "08-01", 
"09-01", "05-01", "06-01", "07-01", "08-01", "09-01")), 
class = "data.frame", row.names = c(NA, 
-10L))

如果您的数据已经根据 Date 排序,对于每个 ClientId,我们可以 select 最后一次转换发生之前的所有行。

这可以在 base R 中完成:

subset(df, ave(Conversion == 1, ClientId, FUN = function(x) seq_along(x) <= max(which(x))))

使用dplyr

library(dplyr)
df %>% group_by(ClientId) %>% filter(row_number() <= max(which(Conversion == 1)))

data.table

library(data.table)
setDT(df)[, .SD[seq_len(.N) <= max(which(Conversion == 1))], ClientId]