当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。