用tidyverse取n个最大值和最小值
我想得到给定数据帧的k个最正和最负的值,而不必分别存储它们。目前,对于k=2,我正在做如下操作:用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
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或错误,根据您的示例,您指的是数据框中的最大和最小数字,而不是正数和负数。我认为有必要对这个问题进行编辑,使其更清楚。根据您的示例,您指的是数据框中的最大和最小数字,而不是正数和负数。我认为这将是值得编辑的问题,以明确它。