当 dplyr 满足条件时过滤掉行

Filter out rows when condition is met with dplyr

如何在不同组的另一列中满足条件时过滤掉一列中的行?

例如:

library(dplyr)

df1 <-tribble(
   ~group, ~var1, ~var2,
  "a", 0, 0,
  "a", 1, 0,
  "a",1, 0,
  "a",0, 1,
  "a", 1, 0,
  "b", 1, 0,
  "b", 0, 1,
  "b", 1, 0,
  "b", 0, 1)

我只想在 var2 中拥有第一个 1 之后才允许 var1 中的那些。因此,在这个例子中,我想得到:

group  var1  var2
  <chr> <dbl> <dbl>
 a         0     0
 a         0     1
 a         1     0
 b         0     1
 b         1     0
 b         0     1

我可以确定我想从哪里开始过滤数据,但不知道具体如何进行:

df1 %>% 
  group_by(var2,group) %>% 
  mutate(test = case_when(row_number() == 1 & var2 == 1 ~ "exclude_previous_rows",
                         T ~ "n"))

我确定有一个简单的方法可以用 dplyr 做到这一点,但目前还没有找到。

我们可以使用累计和。我想这就是你想要的:

df1 %>%
  group_by(group) %>%
  filter(cumsum(var2 == 1) > 0)
# # A tibble: 5 x 3
# # Groups:   group [2]
#   group  var1  var2
#   <chr> <dbl> <dbl>
# 1 a         0     1
# 2 a         1     0
# 3 b         0     1
# 4 b         1     0
# 5 b         0     1

这将按组保留所有行,包括 var2 中第一个 1 和之后的行。我不太确定你所说的 “我想允许 var1 中的那些”是什么意思 - 你的代码似乎忽略了 var1,而我的也一样。

一个选项使用data.table

library(data.table)
setDT(df1)[df1[, .I[cumsum(var2 == 1) > 0], group]$V1]