如何在 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]
我有会话 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]