过滤每组的中间行

时间:2018-04-18 11:42:04

标签: r filter dplyr

df <- data.frame(id=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3), 
             x=c(1,2,3,3,5,1,4,3,1,2,8,9,3,1,0))

对于每个组,如果我想过滤第一行

 df %>%
 group_by(id) %>%
filter(row_number()==1)

如果我必须过滤最中间一行,我该怎么办?

2 个答案:

答案 0 :(得分:9)

n()/2将组的nrow减半,ceiling将奇数值的小数舍入。

df %>%
  group_by(id) %>%
  filter(row_number()==ceiling(n()/2))

# A tibble: 3 x 2
# Groups:   id [3]
     id     x
  <dbl> <dbl>
1     1     3
2     2     3
3     3     3

答案 1 :(得分:4)

您也可以使用slice而不是row_number(),并使用n()来捕获每个组的长度。除以2得到每组的中间值。

library(dplyr)

df %>% 
 group_by(id) %>% 
 slice(ceiling(n()/2))