當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R dplyr slice 使用行的位置對行進行子集化


slice() 允許您按行(整數)位置對行進行索引。它允許您選擇、刪除和複製行。它附帶許多常見用例的幫助程序:

  • slice_head()slice_tail() 選擇第一行或最後一行。

  • slice_sample() 隨機選擇行。

  • slice_min()slice_max() 選擇具有變量的最小值或最大值的行。

如果 .datagrouped_df ,則將對每個組執行該操作,以便(例如)slice_head(df, n = 5) 將選擇每個組中的前五行。

用法

slice(.data, ..., .by = NULL, .preserve = FALSE)

slice_head(.data, ..., n, prop, by = NULL)

slice_tail(.data, ..., n, prop, by = NULL)

slice_min(
  .data,
  order_by,
  ...,
  n,
  prop,
  by = NULL,
  with_ties = TRUE,
  na_rm = FALSE
)

slice_max(
  .data,
  order_by,
  ...,
  n,
  prop,
  by = NULL,
  with_ties = TRUE,
  na_rm = FALSE
)

slice_sample(.data, ..., n, prop, by = NULL, weight_by = NULL, replace = FALSE)

參數

.data

數據幀、數據幀擴展(例如 tibble)或惰性數據幀(例如來自 dbplyr 或 dtplyr)。有關更多詳細信息,請參閱下麵的方法。

...

對於 slice() : < data-masking > 整數行值。

提供要保留的正值或要刪除的負值。提供的值必須全部為正值或全部為負值。超出輸入行數的索引將被靜默忽略。

對於 slice_*() ,這些參數將傳遞給方法。

.by, by

[Experimental]

< tidy-select > (可選)僅針對此操作選擇要分組的列,作為 group_by() 的替代方案。有關詳細信息和示例,請參閱?dplyr_by

.preserve

.data 輸入分組時相關。如果.preserve = FALSE(默認值),則根據結果數據重新計算分組結構,否則分組保持原樣。

n, prop

提供 n (行數)或 prop (要選擇的行的比例)。如果兩者均未提供,則將使用n = 1。如果 n 大於組中的行數(或 prop > 1 ),結果將被靜默截斷為組大小。 prop 將向零舍入以生成整數行。

將從組大小中減去負值nprop。例如,n = -2 具有 5 行一組,將選擇 5 - 2 = 3 行; prop = -0.25 有 8 行將選擇 8 * (1 - 0.25) = 6 行。

order_by

< data-masking > 用於排序的變量或變量函數。要按多個變量排序,請將它們包裝在 DataFrame 或小標題中。

with_ties

關係應該保持在一起嗎?默認值 TRUE 可能會返回比您請求的行數更多的行。使用FALSE 忽略聯係,並返回前n 行。

na_rm

是否應該從結果中刪除 order_by 中的缺失值?如果 FALSENA 值被排序到末尾(如 arrange() ),因此隻有在沒有足夠的非缺失值達到 n /prop 時才會包含它們。

weight_by

<data-masking> 采樣權重。這必須計算為與輸入長度相同的非負數向量。權重自動標準化為總和為 1。

replace

應該使用(TRUE)或不使用(FALSE,默認)替換來執行采樣。

.data 類型相同的對象。輸出具有以下屬性:

  • 每行可能在輸出中出現 0 次、1 次或多次。

  • 列未修改。

  • 組不被修改。

  • DataFrame 屬性被保留。

細節

Slice 不適用於關係數據庫,因為它們沒有行順序的內在概念。如果要執行等效操作,請使用 filter()row_number()

方法

這些函數是泛型函數,這意味著包可以為其他類提供實現(方法)。有關額外參數和行為差異,請參閱各個方法的文檔。

當前加載的包中可用的方法:

  • slice():dbplyr(tbl_lazy)、dplyr(data.frame)。

  • slice_head():dbplyr(tbl_lazy)、dplyr(data.frame)。

  • slice_tail():dbplyr(tbl_lazy)、dplyr(data.frame)。

  • slice_min():dbplyr(tbl_lazy)、dplyr(data.frame)。

  • slice_max():dbplyr(tbl_lazy)、dplyr(data.frame)。

  • slice_sample():dbplyr(tbl_lazy)、dplyr(data.frame)。

也可以看看

其他單表動詞: arrange()filter()mutate()reframe()rename()select()summarise()

例子

# Similar to head(mtcars, 1):
mtcars %>% slice(1L)
#>           mpg cyl disp  hp drat   wt  qsec vs am gear carb
#> Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4
# Similar to tail(mtcars, 1):
mtcars %>% slice(n())
#>             mpg cyl disp  hp drat   wt qsec vs am gear carb
#> Volvo 142E 21.4   4  121 109 4.11 2.78 18.6  1  1    4    2
mtcars %>% slice(5:n())
#>                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
#> Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
#> Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#> Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#> Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
#> Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
#> Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#> Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
#> AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
#> Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
#> Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#> Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    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
# Rows can be dropped with negative indices:
slice(mtcars, -(1:4))
#>                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
#> Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
#> Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#> Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#> Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
#> Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
#> Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#> Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
#> AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
#> Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
#> Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#> Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    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

# First and last rows based on existing order
mtcars %>% slice_head(n = 5)
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
mtcars %>% slice_tail(n = 5)
#>                 mpg cyl  disp  hp drat    wt qsec vs am gear carb
#> Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
#> Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.5  0  1    5    4
#> Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6
#> Maserati Bora  15.0   8 301.0 335 3.54 3.570 14.6  0  1    5    8
#> Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2

# Rows with minimum and maximum values of a variable
mtcars %>% slice_min(mpg, n = 5)
#>                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
#> Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
#> Camaro Z28          13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
#> Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
#> Chrysler Imperial   14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
mtcars %>% slice_max(mpg, n = 5)
#>                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Toyota Corolla 33.9   4 71.1  65 4.22 1.835 19.90  1  1    4    1
#> Fiat 128       32.4   4 78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic    30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
#> Lotus Europa   30.4   4 95.1 113 3.77 1.513 16.90  1  1    5    2
#> Fiat X1-9      27.3   4 79.0  66 4.08 1.935 18.90  1  1    4    1

# slice_min() and slice_max() may return more rows than requested
# in the presence of ties.
mtcars %>% slice_min(cyl, n = 1)
#>                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#> Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#> Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#> Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# Use with_ties = FALSE to return exactly n matches
mtcars %>% slice_min(cyl, n = 1, with_ties = FALSE)
#>             mpg cyl disp hp drat   wt  qsec vs am gear carb
#> Datsun 710 22.8   4  108 93 3.85 2.32 18.61  1  1    4    1
# Or use additional variables to break the tie:
mtcars %>% slice_min(tibble(cyl, mpg), n = 1)
#>             mpg cyl disp  hp drat   wt qsec vs am gear carb
#> Volvo 142E 21.4   4  121 109 4.11 2.78 18.6  1  1    4    2

# slice_sample() allows you to random select with or without replacement
mtcars %>% slice_sample(n = 5)
#>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> Ford Pantera L    15.8   8  351 264 4.22 3.170 14.50  0  1    5    4
#> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> Ferrari Dino      19.7   6  145 175 3.62 2.770 15.50  0  1    5    6
#> Chrysler Imperial 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
#> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
mtcars %>% slice_sample(n = 5, replace = TRUE)
#>                     mpg cyl disp  hp drat   wt  qsec vs am gear carb
#> Maserati Bora      15.0   8  301 335 3.54 3.57 14.60  0  1    5    8
#> Cadillac Fleetwood 10.4   8  472 205 2.93 5.25 17.98  0  0    3    4
#> Dodge Challenger   15.5   8  318 150 2.76 3.52 16.87  0  0    3    2
#> Valiant            18.1   6  225 105 2.76 3.46 20.22  1  0    3    1
#> Volvo 142E         21.4   4  121 109 4.11 2.78 18.60  1  1    4    2

# you can optionally weight by a variable - this code weights by the
# physical weight of the cars, so heavy cars are more likely to get
# selected
mtcars %>% slice_sample(weight_by = wt, n = 5)
#>                mpg cyl  disp  hp drat   wt  qsec vs am gear carb
#> Porsche 914-2 26.0   4 120.3  91 4.43 2.14 16.70  0  1    5    2
#> Merc 280      19.2   6 167.6 123 3.92 3.44 18.30  1  0    4    4
#> Merc 240D     24.4   4 146.7  62 3.69 3.19 20.00  1  0    4    2
#> Merc 450SLC   15.2   8 275.8 180 3.07 3.78 18.00  0  0    3    3
#> Valiant       18.1   6 225.0 105 2.76 3.46 20.22  1  0    3    1

# Group wise operation ----------------------------------------
df <- tibble(
  group = rep(c("a", "b", "c"), c(1, 2, 4)),
  x = runif(7)
)

# All slice helpers operate per group, silently truncating to the group
# size, so the following code works without error
df %>% group_by(group) %>% slice_head(n = 2)
#> # A tibble: 5 × 2
#> # Groups:   group [3]
#>   group     x
#>   <chr> <dbl>
#> 1 a     0.427
#> 2 b     0.403
#> 3 b     0.976
#> 4 c     0.449
#> 5 c     0.755

# When specifying the proportion of rows to include non-integer sizes
# are rounded down, so group a gets 0 rows
df %>% group_by(group) %>% slice_head(prop = 0.5)
#> # A tibble: 3 × 2
#> # Groups:   group [2]
#>   group     x
#>   <chr> <dbl>
#> 1 b     0.403
#> 2 c     0.449
#> 3 c     0.755

# Filter equivalents --------------------------------------------
# slice() expressions can often be written to use `filter()` and
# `row_number()`, which can also be translated to SQL. For many databases,
# you'll need to supply an explicit variable to use to compute the row number.
filter(mtcars, row_number() == 1L)
#>           mpg cyl disp  hp drat   wt  qsec vs am gear carb
#> Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4
filter(mtcars, row_number() == n())
#>             mpg cyl disp  hp drat   wt qsec vs am gear carb
#> Volvo 142E 21.4   4  121 109 4.11 2.78 18.6  1  1    4    2
filter(mtcars, between(row_number(), 5, n()))
#>                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
#> Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
#> Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#> Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#> Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
#> Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
#> Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#> Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
#> AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
#> Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
#> Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#> Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    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/slice.R

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Subset rows using their positions。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。