【问题标题】:How to use multiple conditions filtering with row_number (dplyr)?如何使用 row_number (dplyr) 进行多条件过滤?
【发布时间】:2020-10-31 06:56:38
【问题描述】:

我想同时过滤前 5 行和后 5 行,最好使用dplyr,因为我正试图习惯管道%>&,并且我需要一个前 5 行和后 5 行的 tibble .我可以做,但分开做。

前 5 名:

cars %>% 
  filter(row_number() >= (n() - 4)) 

最后 5 个:

cars %>% 
  filter( row_number () <=5)

我也尝试过使用slice_headslice_tail,但我无法同时使用这两种情况。

或者,我使用基本函数来实现,分别存储每个结果,然后将其与 rbind 放在一起,但不太实用。

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:

    您可以使用slice 来做到这一点:

    library(dplyr)
    mtcars %>% slice(1:5, (n()-4):n())
    
    #                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    #Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    #Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    #Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
    #Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    #Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    #Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    #Ford Pantera L    15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    #Ferrari Dino      19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    #Maserati Bora     15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    #Volvo 142E        21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
    

    同样,在基础 R 中,您可以这样做:

    n <- nrow(mtcars)
    mtcars[c(1:5, (n-4):n), ]
    

    【讨论】:

      【解决方案2】:

      使用过滤器:

      > df <- data.frame(c1 = 1:15,
      +                  c2 = letters[1:15])
      > df
         c1 c2
      1   1  a
      2   2  b
      3   3  c
      4   4  d
      5   5  e
      6   6  f
      7   7  g
      8   8  h
      9   9  i
      10 10  j
      11 11  k
      12 12  l
      13 13  m
      14 14  n
      15 15  o
      > df %>% filter(row_number() < 6 | row_number() > (n() - 5))
         c1 c2
      1   1  a
      2   2  b
      3   3  c
      4   4  d
      5   5  e
      6  11  k
      7  12  l
      8  13  m
      9  14  n
      10 15  o
      > 
      

      【讨论】:

        【解决方案3】:

        使用data.table

        library(data.table)
        as.data.table(mtcars)[c(1:5, (.N-4):.N)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-19
          • 1970-01-01
          • 1970-01-01
          • 2018-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多