【发布时间】:2022-01-12 13:36:40
【问题描述】:
我有一个数据表,其中包括一个 ID、一个(以某种方式排序的)分组列和一个日期。对于每个 ID,根据给定组的日期最小值,我想过滤掉另一个给定组在该日期之后发生的行。
我考虑过使用pivot_wider 和pivot_longer,但是我无法同时对包含列表值和单个值的列进行操作。
我怎样才能有效地做到这一点(如果可能,使用任何tidyverse 方法)?
例如,给定
library(dplyr)
tbl <- tibble(id = c(rep(1,5), rep(2,5)),
type = c("A","A","A","B","C","A","A","B","B","C"),
dat = as.Date("2021-12-07") - c(3,0,1,2,0,3,6,2,4,3))
# A tibble: 10 × 3
# id type dat
# <int> <chr> <date>
# 1 1 A 2021-12-04
# 2 1 A 2021-12-07
# 3 1 A 2021-12-06
# 4 1 B 2021-12-05
# 5 1 C 2021-12-07
# 6 2 A 2021-12-04
# 7 2 A 2021-12-01
# 8 2 B 2021-12-05
# 9 2 B 2021-12-03
# 10 2 C 2021-12-04
我想要以下结果,其中我丢弃了出现在第一个 B 类型元素之后的 A 类型元素,但没有一个 C 类型元素:
# A tibble: 7 × 3
# id type dat
# <int> <chr> <date>
# 1 1 A 2021-12-04
# 2 1 B 2021-12-05
# 3 1 C 2021-12-07
# 4 2 A 2021-12-01
# 5 2 B 2021-12-05
# 6 2 B 2021-12-03
# 7 2 C 2021-12-04
【问题讨论】:
-
我假设C类型的日期是2021-12-07 ?
-
是的,这是一个复制粘贴错误。谢谢
-
您的示例在多大程度上代表了您的真实用例? IE。你的类型总是 A/B/C = 字母吗?您是否只对过滤类型 A 与 B 感兴趣,或者是否还有过滤 B 与 C 或 A 与 C 的情况?请澄清。
-
这个例子有点抽象。在我的特殊情况下,
type是一种排序的事件集(例如,购买