使用dplyr筛选最大值之前的所有值

使用dplyr筛选最大值之前的所有值,r,dplyr,R,Dplyr,我对如何正确地做到以下几点感到相当困惑。我知道这可能很简单,但我不太明白 假设我有一个仪器收集的数据,该仪器被升高和降低到水中。除了数据之外,还进行了深度读数。假设我只对下降过程中的数据感兴趣,并且希望过滤掉上升过程中的所有数据。更明确地说,我想在深度的最低值之前过滤深度读数。一个小问题是,数据通常有两个深度值,在继续下降到最深点之前,深度值会略微上升。因此,这不是一个纯粹的上升/下降问题。理想情况下使用dplyr方法(或与dplyr配合良好的方法),因为数据中有组。以下是一些虚拟数据: lib

我对如何正确地做到以下几点感到相当困惑。我知道这可能很简单,但我不太明白

假设我有一个仪器收集的数据,该仪器被升高和降低到水中。除了数据之外,还进行了深度读数。假设我只对下降过程中的数据感兴趣,并且希望过滤掉上升过程中的所有数据。更明确地说,我想在
深度的最低值
之前过滤深度读数。一个小问题是,数据通常有两个深度值,在继续下降到最深点之前,深度值会略微上升。因此,这不是一个纯粹的上升/下降问题。理想情况下使用
dplyr
方法(或与
dplyr
配合良好的方法),因为数据中有组。以下是一些虚拟数据:

library(dplyr)

df1 <- data.frame(depth=c(1:6,5,7:10,10.5:1), x=rnorm(21), Group="x")
df2 <- data.frame(depth=c(1:6,5,7:10,10.5:1), x=rnorm(21), Group="y")
df <- rbind(df1, df2)
我还可以找到(使用@Marc的答案)一组的深度:

df %>%
  filter(Group=="x") %>%
  add_rownames() %>%
  filter(rowname %in% c(seq(which.max(depth))))
但是,当我尝试添加一个
groupby
语句时,我仍然只能从第一个组得到所需的结果:

df %>%
  add_rownames() %>%
  group_by(Group) %>%
  filter(rowname %in% c(seq(which.max(depth))))
我没想到
groupby
会使用filter,但我不知道如果不在这里使用filter,如何对行名进行sub。这里有什么想法吗?

这很有效:

df[seq(which.max(df$depth)),]

似乎没有为该问题想出一个
dplyr
解决方案,但是
数据。表
替代方案有效:

library(data.table)
setDT(df)[, head(.SD, which.max(depth)), by = Group]  
# say the factor is some grouping variable you are trying to apply

    Group depth           x
 1:     x   1.0 -0.22907469
 2:     x   2.0  0.15284187
 3:     x   3.0  1.99289070
 4:     x   4.0 -0.80802497
 5:     x   5.0  0.41455226
 6:     x   6.0  0.39673474
 7:     x   5.0 -0.35179347
 8:     x   7.0 -0.18892176
 9:     x   8.0  2.97448709
10:     x   9.0 -0.14464747
11:     x  10.0  0.99434061
12:     x  10.5 -0.64831649
13:     y   1.0  1.10262757
14:     y   2.0 -0.64630288
15:     y   3.0  0.43909555
16:     y   4.0 -0.00575027
17:     y   5.0 -0.81374528
18:     y   6.0 -0.45948930
19:     y   5.0  0.03333462
20:     y   7.0  0.31111807
21:     y   8.0  1.64502251
22:     y   9.0  0.97451275
23:     y  10.0  1.12403518
24:     y  10.5  1.21710311
    Group depth           x
坚持使用
dplyr
,您可以创建一个新的
id
变量来分别标记每个组的行,然后根据
哪个.max进行筛选:

df %>% group_by(Group) %>% mutate(id = seq_len(n())) %>% filter(id <= which.max(depth))
df%>%group\u by(group)%%>%mutate(id=seq\u len(n())%%>%filter(id另一种方法

library(dplyr)
df %>% group_by(Group) %>% filter(between(row_number(),1,which.max(depth)))

@Psidom——正如我上面所说,严格来说,这不是我需要匹配的升序/降序模式。@Marc的答案能给你你所需要的吗?@Psidom不完全正确。我还没有完全弄清楚如何在类似
dplyr
的方法中应用它。你必须使用
dplyr
?哪一部分与Marc的答案不符?我试着去做ep我的例子很简单,但我的实际应用是分组做运动。因此,在一个因子指定的组中,找出高于最低点的所有值。因此,Marc的答案并不完全正确。我只是不知道如何在
dplyr
中应用行号方法,以便我可以通过
group\u
使用
我修改了我的question。多亏了你和Marc,我才稍微接近了一点,但我还是不太清楚。在答案中添加了一个
dplyr
解决方案。问题是,当你使用
dplyr
添加行名时,它不是按组添加的,所以解决方案不起作用。你可以为每个组单独添加一个
id
变量,然后再添加一个子集ba基于此。回答很好。这里的
row_number()
似乎是按组进行的。+1此答案有效,但请注意,此处的筛选函数易受数据排序方式的影响,因为它是按row_number进行排序的。避免问题的一个简单预防措施是将数据排序到一个指示测量时间的变量上(不包括在OP的虚拟数据中)。
library(dplyr)
df %>% group_by(Group) %>% filter(between(row_number(),1,which.max(depth)))