用tidyverse取n个最大值和最小值

用tidyverse取n个最大值和最小值,r,tidyverse,R,Tidyverse,我想得到给定数据帧的k个最正和最负的值,而不必分别存储它们。目前,对于k=2,我正在做如下操作: df %>% arrange(desc(n)) %>% top_n(2) df %>% arrange(desc(n)) %>% top_n(-2)) 但我想知道是否有一种更简单的方法来执行此操作,而不必存储它们,然后绑定_行。我想是的,因为这真的很方便做一些几何吧 假设我正在使用任何tibble,例如: df <- tibble(x = 1:10, n = 1:1

我想得到给定数据帧的k个最正和最负的值,而不必分别存储它们。目前,对于k=2,我正在做如下操作:

df %>%
arrange(desc(n)) %>%
top_n(2)

df %>%
arrange(desc(n)) %>%
top_n(-2))
但我想知道是否有一种更简单的方法来执行此操作,而不必存储它们,然后绑定_行。我想是的,因为这真的很方便做一些几何吧

假设我正在使用任何tibble,例如:

df <- tibble(x = 1:10, n = 1:10)
我想得到1,2,9,10的值,我们可以在按“n”排列后使用slice。在这里,我们只会安排一次

library(dplyr)
top_n_rows <- 2
df %>% 
    arrange(n) %>%
    slice(sort(c(seq_len(top_n_rows),  n() - seq_len(top_n_rows) + 1)))
# A tibble: 4 x 2
#      x     n
#  <int> <int>
#1     1     1
#2     2     2
#3     9     9
#4    10    10
如果我们只是对前n行和后n行进行子集划分,而不考虑要排序的任何列

rbind(head(df, top_n_rows), tail(df, top_n_rows))
或者使用row.name

我们可以在按“n”排列后使用slice。在这里,我们只会安排一次

library(dplyr)
top_n_rows <- 2
df %>% 
    arrange(n) %>%
    slice(sort(c(seq_len(top_n_rows),  n() - seq_len(top_n_rows) + 1)))
# A tibble: 4 x 2
#      x     n
#  <int> <int>
#1     1     1
#2     2     2
#3     9     9
#4    10    10
如果我们只是对前n行和后n行进行子集划分,而不考虑要排序的任何列

rbind(head(df, top_n_rows), tail(df, top_n_rows))
或者使用row.name

另一种选择:

library(dplyr)

df %>%
  slice(which(rank(n) %in% 1:2), which(rank(desc(n)) %in% 1:2))
输出:

# A tibble: 4 x 2
      x     n
  <int> <int>
1     1     1
2     2     2
3     9     9
4    10    10
另一种选择:

library(dplyr)

df %>%
  slice(which(rank(n) %in% 1:2), which(rank(desc(n)) %in% 1:2))
输出:

# A tibble: 4 x 2
      x     n
  <int> <int>
1     1     1
2     2     2
3     9     9
4    10    10

我们可以预先计算要选择的行

no_rows <- 2
num <- c(1:no_rows, (nrow(df) - no_rows + 1):nrow(df))
或过滤器

显然,这也适用于直接子集:

df[num, ]
除此之外,在使用top_n时,我们不需要安排数据,我们可以直接使用它

bind_rows(df %>% top_n(no_rows, n), df %>% top_n(-no_rows, n)) %>% arrange_all()

我们可以预先计算要选择的行

no_rows <- 2
num <- c(1:no_rows, (nrow(df) - no_rows + 1):nrow(df))
或过滤器

显然,这也适用于直接子集:

df[num, ]
除此之外,在使用top_n时,我们不需要安排数据,我们可以直接使用它

bind_rows(df %>% top_n(no_rows, n), df %>% top_n(-no_rows, n)) %>% arrange_all()

对于正/负值,我遇到了这个解决方案

df %>%
  group_by(n < 0) %>%
  top_n(2, abs(n)) %>%
  ungroup()

对于正/负值,我遇到了这个解决方案

df %>%
  group_by(n < 0) %>%
  top_n(2, abs(n)) %>%
  ungroup()

我喜欢第二个!更容易理解的是,我们应该考虑数据帧长度小于2×Topnnx行的一般情况吗?结果应该是什么?@MarkNeal这取决于OP可能需要什么。如果是完整的data.frame或错误,我喜欢第二个!更容易理解的是,我们应该考虑数据帧长度小于2×Topnnx行的一般情况吗?结果应该是什么?@MarkNeal这取决于OP可能需要什么。如果是完整的data.frame或错误,根据您的示例,您指的是数据框中的最大和最小数字,而不是正数和负数。我认为有必要对这个问题进行编辑,使其更清楚。根据您的示例,您指的是数据框中的最大和最小数字,而不是正数和负数。我认为这将是值得编辑的问题,以明确它。