首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Slice_min和Slice_max Tie澄清

Slice_min和Slice_max Tie澄清
EN

Stack Overflow用户
提问于 2021-10-08 18:32:10
回答 3查看 2K关注 0票数 1

dplyr在使用slice_minslice_max时什么时候返回领带?我看到了一些不一致的地方,似乎在网上或他们的文档中找不到任何澄清。

示例:

代码语言:javascript
复制
library(dplyr)

#there is a tie but only returns 5 rows, not the bottom 5 mpg's
mtcars %>% slice_min(mpg, n = 5, with_ties = TRUE)
#>                      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

#this will return the top two as a tie when above it did not
mtcars %>%
  slice_min(mpg, n = 1, with_ties = TRUE)
#>                      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

#another example of it using ties to return more than 3 rows
starwars %>%
  select(gender, mass) %>%
  group_by(gender) %>%
  slice_min(mass, n = 3, with_ties = TRUE)
# A tibble: 8 x 2
# Groups:   gender [3]
#  gender     mass
#       
#1 feminine     45
#2 feminine     49
#3 feminine     50
#4 feminine     50
#5 masculine    15
#6 masculine    17
#7 masculine    20
#8 NA           48

我是不是漏掉了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-08 18:43:56

“领带”指的是边界线,而不是任何领带。因此,如果包含的最后一个元素与一个否则会被排除在外的元素绑定,"with_ties“就会将其拖到输出中。

代码语言:javascript
复制
my_data <- data.frame(a = c(1, 1, 2, 2))

> slice_min(my_data, a, n = 1)
  a
1 1
2 1
> slice_min(my_data, a, n = 2)
  a
1 1
2 1
> slice_min(my_data, a, n = 3)
  a
1 1
2 1
3 2
4 2

如果您想要三个最低的mpg,您可以从一个不同的mpg列表开始,将其切片,并连接到原始数据:

代码语言:javascript
复制
mtcars %>%
  distinct(mpg) %>%
  slice_min(mpg, n = 3) %>%
  left_join(mtcars)

Joining, by = "mpg"
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
2 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
3 13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
4 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
票数 3
EN

Stack Overflow用户

发布于 2021-10-08 18:34:27

当数据中只有一个值时,slice_min/slice_max可能会出现一些问题。它还意味着,假设行数为10000,它将返回所有行,无论是否绑定。

代码语言:javascript
复制
dat <- tibble(a = rep(1, 5))
> slice_min(dat, a, n = 1)
# A tibble: 5 × 1
      a
  <dbl>
1     1
2     1
3     1
4     1
5     1

> slice_min(dat, a, n = 1, with_ties = TRUE)
# A tibble: 5 × 1
      a
  <dbl>
1     1
2     1
3     1
4     1
5     1

如果有重复的值,选项是to arrange并使用slice

代码语言:javascript
复制
mtcars %>%
    arrange(desc(mpg)) %>%
    slice(1)

我们也可以在一个filter中获得输出。

代码语言:javascript
复制
mtcars %>% filter(mpg %in% tail(unique(sort(mpg)), 3))
                mpg cyl disp  hp drat    wt  qsec vs am gear carb
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
Lotus Europa   30.4   4 95.1 113 3.77 1.513 16.90  1  1    5    2
> mtcars %>% filter(mpg %in% head(unique(sort(mpg)), 3))
                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
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
票数 0
EN

Stack Overflow用户

发布于 2021-10-08 18:44:05

来自最大值

它说:

with_ties 关系应该保持在一起吗?默认的TRUE可能返回比您请求的行更多的行。使用FALSE忽略领带,并返回前n行。

这意味着,如果您所要求的最小值的数量小于具有此最小值的条目的实际数量,您将得到比您预期的更大的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69500318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档