如何同时获取tibble的“头”和“尾”

问题描述 投票:0回答:3

我想同时过滤前 5 行和后 5 行,最好使用

dplyr
,因为我正在尝试习惯管道
%>&
并且我需要一个 5 个第一个和 5 个最后一个的 tibble。我可以做,但要分开做。

对于前 5 个:

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

最后 5 次:

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

我也尝试过

slice_head
slice_tail
,但我无法同时在这两种情况下做到这一点。

或者,我使用基本函数来完成,分别存储每个结果,然后将其与

rbind
放在一起,但不太实用。

r filter dplyr
3个回答
3
投票

你可以用

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), ]

0
投票

使用过滤器:

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

0
投票

使用

data.table

library(data.table)
as.data.table(mtcars)[c(1:5, (.N-4):.N)]
© www.soinside.com 2019 - 2024. All rights reserved.