制作一个 table 显示 R 中变量的 10 个最大值?
Make a table showing the 10 largest values of a variable in R?
我想做一个简单的 table 来展示我数据集中给定变量的最大 10 个值,以及每个观察的 4 个其他变量,所以基本上是我数据的一小部分。它看起来像这样:
Score District Age Group Gender
17 B 23 Red 1
12 A 61 Red 0
11.7 A 18 Blue 0
10 B 18 Red 0
.
.
etc.
据此,数据在 Score var 上排序。所有数据都包含在同一个数据框中。
应该这样做...
data <- data[with(data,order(-Score)),]
data <- data[1:10,]
您可以使用 dplyr
中的 arrange
来完成此操作。如果有分组变量,这也应该有效。只需在 arrange
之前添加 group_by
。我们使用 slice
.
过滤前 10 个观察值
library(dplyr)
df1 %>%
arrange(desc(Score)) %>%
slice(1:10)
或者另一种选择是来自 dplyr
的 ?top_n
(@docendodiscimus 评论),它是一个使用 filter
和 min_rank
到 select 的包装器'Score'.
的前 n(即 10)个条目
top_n(df1, 10, Score)
或者我们通过使用 row_number
创建逻辑条件来使用 filter
,这相当于 rank(ties.method='first')
(由@Steven Beaupre 提供)
filter(df1, row_number(desc(Score)) <= 10)
或者 data.table 选项(@David Arenburg)。我们将 'data.frame' 转换为 'data.table' (setDT(df1)
),order
(减少)'Score' 变量,以及 select 前 10 个观察值。 .SD
表示 Subset of DataTable
.
library(data.table)
setDT(df1)[order(-Score), .SD[1:10]]
您可以使用以下代码获取向量的最大值:
my_vec <- c(1:100)
tail(sort(my_vec),10)
因此,如果您想将此方法用作数据框过滤器,您可以这样做:
data(mtcars)
mtcars[mtcars$mpg %in% tail(sort(mtcars$mpg),4),]
这将产生:
> mtcars[mtcars$mpg %in% tail(sort(mtcars$mpg),4),]
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
使用sqldf
:
library(sqldf)
sqldf("SELECT * FROM mtcars
ORDER BY mpg DESC
LIMIT 10", row.names = TRUE)
输出:
mpg cyl disp hp drat wt qsec vs am gear carb
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
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
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
从dplyr
>= 1.0.0开始,我们可以使用slice_max
功能。
library(dplyr)
mtcars %>% slice_max(mpg, n = 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#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
#Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
默认选择有联系的行,如果您想忽略联系并严格 return n
行使用 with_ties = FALSE
.
我想做一个简单的 table 来展示我数据集中给定变量的最大 10 个值,以及每个观察的 4 个其他变量,所以基本上是我数据的一小部分。它看起来像这样:
Score District Age Group Gender
17 B 23 Red 1
12 A 61 Red 0
11.7 A 18 Blue 0
10 B 18 Red 0
.
.
etc.
据此,数据在 Score var 上排序。所有数据都包含在同一个数据框中。
应该这样做...
data <- data[with(data,order(-Score)),]
data <- data[1:10,]
您可以使用 dplyr
中的 arrange
来完成此操作。如果有分组变量,这也应该有效。只需在 arrange
之前添加 group_by
。我们使用 slice
.
library(dplyr)
df1 %>%
arrange(desc(Score)) %>%
slice(1:10)
或者另一种选择是来自 dplyr
的 ?top_n
(@docendodiscimus 评论),它是一个使用 filter
和 min_rank
到 select 的包装器'Score'.
top_n(df1, 10, Score)
或者我们通过使用 row_number
创建逻辑条件来使用 filter
,这相当于 rank(ties.method='first')
(由@Steven Beaupre 提供)
filter(df1, row_number(desc(Score)) <= 10)
或者 data.table 选项(@David Arenburg)。我们将 'data.frame' 转换为 'data.table' (setDT(df1)
),order
(减少)'Score' 变量,以及 select 前 10 个观察值。 .SD
表示 Subset of DataTable
.
library(data.table)
setDT(df1)[order(-Score), .SD[1:10]]
您可以使用以下代码获取向量的最大值:
my_vec <- c(1:100)
tail(sort(my_vec),10)
因此,如果您想将此方法用作数据框过滤器,您可以这样做:
data(mtcars)
mtcars[mtcars$mpg %in% tail(sort(mtcars$mpg),4),]
这将产生:
> mtcars[mtcars$mpg %in% tail(sort(mtcars$mpg),4),]
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
使用sqldf
:
library(sqldf)
sqldf("SELECT * FROM mtcars
ORDER BY mpg DESC
LIMIT 10", row.names = TRUE)
输出:
mpg cyl disp hp drat wt qsec vs am gear carb
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
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
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
从dplyr
>= 1.0.0开始,我们可以使用slice_max
功能。
library(dplyr)
mtcars %>% slice_max(mpg, n = 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#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
#Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
默认选择有联系的行,如果您想忽略联系并严格 return n
行使用 with_ties = FALSE
.