【发布时间】:2020-12-26 20:51:39
【问题描述】:
我有一个数据框,其中包含一个组、一个因组而异的条件以及每个组内的索引:
df <- data.frame(group = c(rep(c("A", "B", "C"), each = 3)),
condition = rep(c(0,1,1), each = 3),
index = c(1:3,1:3,2:4))
> df
group condition index
1 A 0 1
2 A 0 2
3 A 0 3
4 B 1 1
5 B 1 2
6 B 1 3
7 C 1 2
8 C 1 3
9 C 1 4
我想对每个组中的数据进行切片,过滤掉除索引最低的行之外的所有数据。但是,仅当条件适用时才应应用此过滤器,即condition == 1。我的解决方案是计算每个组内索引的排名,并根据条件和排名的组合进行过滤:
df %>%
group_by(group) %>%
mutate(rank = order(index)) %>%
filter(case_when(condition == 0 ~ TRUE,
condition == 1 & rank == 1 ~ TRUE))
# A tibble: 5 x 4
# Groups: group [3]
group condition index rank
<chr> <dbl> <int> <int>
1 A 0 1 1
2 A 0 2 2
3 A 0 3 3
4 B 1 1 1
5 C 1 2 1
这让我想知道是否有更快的解决方案不需要单独的排名变量,并且可能使用 slice_min() 代替。
【问题讨论】:
-
您可以使用
slice和which.min() -
我可能不完全理解 which.min() 是如何工作的,但这并不能说明这种情况,不是吗?