如果第一行满足特定条件,则删除所有匹配 ID 的数据

Remove all data matching ID if first row meets specific condition

我正在尝试删除 client_id 的所有数据,当 第一个 项目的 score 与该客户(按日期排序时)匹配具体情况。根据我的阅读,似乎 data.table 可以做到,而且我已经能够 接近 到达那里。

下面是一些示例数据:

client_id <- c(1,1,1,2,2,3,3,3,3,4,4)
date <- c("1/1/2021", "1/2/2021", "1/3/2021", "5/1/2021", "10/1/2021", "10/1/2021", "11/1/2021", "1/2/2021", "10/9/2021", "15/9/2021", "16/10/2021")
date <- as.Date(date, '%d/%m/%Y')
score <- c(15,10,19,20,10,25,20,15,10,30,5)
df <- data.frame(client_id, date, score)

我试过这个:

df <-setDT(df)
df[client_id %in% df[score > 16, client_id], ]

我希望这会删除 client_id 1,因为 first 分数 < 16。但是,这似乎只有在所有分数 > 16.

感谢任何帮助!

您可以将 .SDfirst 一起使用,前提是 df 中的日期按升序排列:

df[,.SD[first(score)>16],by=client_id]
   client_id       date score
       <num>     <Date> <num>
1:         2 2021-01-05    20
2:         2 2021-01-10    10
3:         3 2021-01-10    25
4:         3 2021-01-11    20
5:         3 2021-02-01    15
6:         3 2021-09-10    10
7:         4 2021-09-15    30
8:         4 2021-10-16     5

可能使用which.min(date)更安全:

df[,.SD[score[which.min(date)]>16],by=client_id]

一个tidyverse选项:

library(tidyverse)

df %>% 
  arrange(client_id, date) %>% 
  group_by(client_id) %>% 
  filter(first(score) > 16)

输出

  client_id date       score
      <dbl> <date>     <dbl>
1         2 2021-01-05    20
2         2 2021-01-10    10
3         3 2021-01-10    25
4         3 2021-01-11    20
5         3 2021-02-01    15
6         3 2021-09-10    10
7         4 2021-09-15    30
8         4 2021-10-16     5

或另一个data.table选项:

df[df[, .I[first(score)>16], by=client_id]$V1]

   client_id       date score
1:         2 2021-01-05    20
2:         2 2021-01-10    10
3:         3 2021-01-10    25
4:         3 2021-01-11    20
5:         3 2021-02-01    15
6:         3 2021-09-10    10
7:         4 2021-09-15    30
8:         4 2021-10-16     5