首页 > 解决方案 > 组合 group_by、ifelse 和 filter

问题描述

我想结合 group_by、ifelse 并为下面的示例数据框过滤我的代码。我想要的是以下内容:1)按x分组。2)检查结果是否> 1。如果为真,检查该组的结果> 1 == max(月)的月份。如果为 TRUE,则选择该组的所有行。所有其他行都应该被丢弃(所以在结果 <= 1 或 (month where result > 1 != max(month)) 的情况下。所以在我的示例数据框中,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))

标签: rdplyr

解决方案


使用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

推荐阅读