我有以下 df:
df <- data.frame(var1 = c(1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9),
var2 = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"))
Run Code Online (Sandbox Code Playgroud)
我想在达到前 5 (var1) 后进行过滤。所以结果应该是:
var1 var2
1 1 a
2 2 b
3 2 c
4 3 d
5 4 e
6 5 f
Run Code Online (Sandbox Code Playgroud)
我试过:
df1 <- df %>%
mutate(a = !duplicated(var1)) %>%
filter(var1 < 6 & a == TRUE)
Run Code Online (Sandbox Code Playgroud)
但这里的问题是,它也删除了重复的 var2(c)。
我们可以用它cumsum来创建一个逻辑vector
df %>%
filter(cumsum(var1 == 5) < 2)
# var1 var2
#1 1 a
#2 2 b
#3 2 c
#4 3 d
#5 4 e
#6 5 f
Run Code Online (Sandbox Code Playgroud)
或者另一个选择slice是match
df %>%
slice(seq(match(5, var1)))
Run Code Online (Sandbox Code Playgroud)
或者与which.max(假设有 5 值)
df %>%
slice(seq(which.max(var1 == 5)))
Run Code Online (Sandbox Code Playgroud)