当 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]
如何在不同组的另一列中满足条件时过滤掉一列中的行?
例如:
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]