我想结合group_by,ifelse并过滤下面的示例数据帧的代码。我想要的是以下内容:1( 按 x 分组。 2( 检查结果是否> 1.如果为 TRUE,则检查该组的结果是否为>1 == max(月(。如果为 TRUE,则选择该组的所有行。所有其他行都应丢弃(因此,在结果 <= 1 或(结果> 1 != max(月(的情况下,应丢弃所有其他行(。因此,在我的示例数据框中,应保留 B 的所有行,而丢弃 A 的所有行。
x month result
1 A 1 0.5
2 A 2 0.6
3 A 3 1.2
4 A 4 1.1
5 A 5 0.9
6 B 1 0.3
7 B 2 0.4
8 B 3 0.5
9 B 4 0.9
10 B 5 1.2
dat <- data.frame(x = c("A","A","A","A","A","B","B","B","B","B"),
month = c(1,2,3,4,5,1,2,3,4,5),
result = c(.5,.6,1.2,1.1,.9,.3,.4,.5,.9,1.2))
使用data.table
library(data.table)
setDT(dat)[, .SD[result[which.max(month)] > 1], x]
# x month result
#1: B 1 0.3
#2: B 2 0.4
#3: B 3 0.5
#4: B 4 0.9
#5: B 5 1.2
或与dplyr
library(dplyr)
dat %>%
group_by(x) %>%
filter(result[which.max(month)] > 1)
# A tibble: 5 x 3
# Groups: x [1]
# x month result
# <fct> <dbl> <dbl>
#1 B 1 0.3
#2 B 2 0.4
#3 B 3 0.5
#4 B 4 0.9
#5 B 5 1.2
如果你想留在tidyverse
而不是冒险进行基地选择,我们也可以很容易地到达那里,只需使用any
来检查小组中是否有人符合你的标准:
dat %>%
group_by(x) %>%
filter(any(result > 1 & month == max(month)))
# A tibble: 5 x 3
# Groups: x [1]
x month result
<fct> <dbl> <dbl>
1 B 1 0.3
2 B 2 0.4
3 B 3 0.5
4 B 4 0.9
5 B 5 1.2
或者,有时我会创建一个"keep"变量来检查我最初是否有正确的变量,或者让多年后查看我的代码的人更容易阅读代码:
dat %>%
group_by(x) %>%
mutate(keep = (result > 1 & month == max(month))) %>%
filter(any(keep))
这是一个解决方案 带base R
(不带group_by
或filter
(
res <- Reduce(rbind,lapply(split(dat,dat$x), function(v) {
if (v$result[which.max(v$month)]>1) v else NULL}))
这样
> res
x month result
6 B 1 0.3
7 B 2 0.4
8 B 3 0.5
9 B 4 0.9
10 B 5 1.2