我对如何正确地执行以下操作感到困惑。我知道它可能很简单,但我无法弄明白。
假设我有一个升降到水中的仪器收集的数据。免费提供数据,深度阅读。假设我只对向下的方式数据感兴趣,并希望过滤掉所有数据。更明确地说,我希望过滤之前的深度读数 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做分。这里有什么想法吗?
答案 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))