我对如何正确执行以下操作感到困惑。我知道这可能很简单,但我不太清楚。
假设我有一个通过上升和下降到水里的仪器收集的数据。除数据外,还可以读取深度。假设我只对下行数据感兴趣,并想从上行数据中过滤掉所有数据。更明确地说,我想在的最低值之前过滤深度读数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的答案)一组的深度:
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
要使用过滤器,但是我不知道如何在不使用过滤器的情况下为行名求子。这里有什么想法吗?
似乎并没有想出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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句