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


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


這些是 dplyr 泛型 slice_min()slice_max()slice_sample() 的方法。它們使用 filter() 和窗口函數( ROWNUMBERMIN_RANKCUME_DIST 取決於參數)轉換為 SQL。不支持 slice()slice_head()slice_tail() ,因為數據庫表沒有內在順序。

如果數據已分組,則將對每個組執行操作,以便(例如)slice_min(db, x, n = 3) 將選擇每個組中 x 值最小的三行。

用法

# S3 method for tbl_lazy
slice_min(.data, order_by, ..., n, prop, by = NULL, with_ties = TRUE)

# S3 method for tbl_lazy
slice_max(.data, order_by, ..., n, by = NULL, prop, with_ties = TRUE)

# S3 method for tbl_lazy
slice_sample(.data, ..., n, prop, by = NULL, weight_by = NULL, replace = FALSE)

參數

.data

由數據庫查詢支持的惰性 DataFrame 。

order_by

排序依據的變量或變量函數。

...

不曾用過。

n, prop

提供 n (行數)或 prop (要選擇的行的比例)。如果兩者均未提供,則將使用n = 1

如果 n 大於組中的行數(或 prop > 1),結果將被靜默截斷為組大小。如果組大小的比例不是整數,則向下舍入。

by

[Experimental]

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

with_ties

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

weight_by, replace

不支持數據庫後端。

例子

library(dplyr, warn.conflicts = FALSE)

db <- memdb_frame(x = 1:3, y = c(1, 1, 2))
db %>% slice_min(x) %>% show_query()
#> <SQL>
#> SELECT `x`, `y`
#> FROM (
#>   SELECT *, RANK() OVER (ORDER BY `x`) AS `q01`
#>   FROM `dbplyr_006`
#> )
#> WHERE (`q01` <= 1)
db %>% slice_max(x) %>% show_query()
#> <SQL>
#> SELECT `x`, `y`
#> FROM (
#>   SELECT *, RANK() OVER (ORDER BY `x` DESC) AS `q01`
#>   FROM `dbplyr_006`
#> )
#> WHERE (`q01` <= 1)
db %>% slice_sample() %>% show_query()
#> <SQL>
#> SELECT `x`, `y`
#> FROM (
#>   SELECT *, ROW_NUMBER() OVER (ORDER BY RANDOM()) AS `q01`
#>   FROM `dbplyr_006`
#> )
#> WHERE (`q01` <= 1)

db %>% group_by(y) %>% slice_min(x) %>% show_query()
#> <SQL>
#> SELECT `x`, `y`
#> FROM (
#>   SELECT *, RANK() OVER (PARTITION BY `y` ORDER BY `x`) AS `q01`
#>   FROM `dbplyr_006`
#> )
#> WHERE (`q01` <= 1)

# By default, ties are includes so you may get more rows
# than you expect
db %>% slice_min(y, n = 1)
#> # Source:   SQL [2 x 2]
#> # Database: sqlite 3.41.2 [:memory:]
#>       x     y
#>   <int> <dbl>
#> 1     1     1
#> 2     2     1
db %>% slice_min(y, n = 1, with_ties = FALSE)
#> # Source:   SQL [1 x 2]
#> # Database: sqlite 3.41.2 [:memory:]
#>       x     y
#>   <int> <dbl>
#> 1     1     1

# Non-integer group sizes are rounded down
db %>% slice_min(x, prop = 0.5)
#> # Source:   SQL [1 x 2]
#> # Database: sqlite 3.41.2 [:memory:]
#>       x     y
#>   <int> <dbl>
#> 1     1     1
源代碼:R/verb-slice.R

相關用法


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