使用dplyr过滤最大值之前的所有值

时间:2016-07-11 16:17:03

标签: r dplyr

我对如何正确地执行以下操作感到困惑。我知道它可能很简单,但我无法弄明白。

假设我有一个升降到水中的仪器收集的数据。免费提供数据,深度阅读。假设我只对向下的方式数据感兴趣,并希望过滤掉所有数据。更明确地说,我希望过滤之前的深度读数 depth的最低值。一个小问题是,数据通常会有一些深度值在继续下降到最深点之前略​​有上升。所以它不是一个纯粹的上升/下降问题。理想情况下使用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)

我一直陷入困境,因为我很容易找到最深的价值:

df %>% mutate(depth==max(depth))

我也可以找到(使用@ Marc&#39;答案)一组的深度:

df %>%
  filter(Group=="x") %>%
  add_rownames() %>%
  filter(rowname %in% c(seq(which.max(depth))))

但是,当我尝试添加group_by语句时,我仍然只能从第一组获得所需的结果:

df %>%
  add_rownames() %>%
  group_by(Group) %>%
  filter(rowname %in% c(seq(which.max(depth))))

我不希望group_by使用过滤器,但我不知道如何在不使用过滤器的情况下为rownames做分。这里有什么想法吗?

3 个答案:

答案 0 :(得分:3)

另一种方法

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

答案 1 :(得分:1)

这有效:

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

答案 2 :(得分:1)

似乎没有为问题提出dplyr解决方案,但data.table替代方案有效:

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变量来分别标记每个组的行,然后根据which.max进行过滤:

df %>% group_by(Group) %>% mutate(id = seq_len(n())) %>% filter(id <= which.max(depth))