dplyr在使用slice_min和slice_max时什么时候返回领带?我看到了一些不一致的地方,似乎在网上或他们的文档中找不到任何澄清。
示例:
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我是不是漏掉了什么?
发布于 2021-10-08 18:43:56
“领带”指的是边界线,而不是任何领带。因此,如果包含的最后一个元素与一个否则会被排除在外的元素绑定,"with_ties“就会将其拖到输出中。
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列表开始,将其切片,并连接到原始数据:
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发布于 2021-10-08 18:34:27
当数据中只有一个值时,slice_min/slice_max可能会出现一些问题。它还意味着,假设行数为10000,它将返回所有行,无论是否绑定。
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
mtcars %>%
arrange(desc(mpg)) %>%
slice(1)我们也可以在一个filter中获得输出。
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发布于 2021-10-08 18:44:05
来自最大值
它说:
with_ties 关系应该保持在一起吗?默认的TRUE可能返回比您请求的行更多的行。使用FALSE忽略领带,并返回前n行。
这意味着,如果您所要求的最小值的数量小于具有此最小值的条目的实际数量,您将得到比您预期的更大的输出。
https://stackoverflow.com/questions/69500318
复制相似问题