r语言 - 组合group_by、ifelse 和过滤器



我想结合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_byfilter(

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

最新更新