制作一个表格,显示R语言中某个变量的前10个最大值?

14

我想制作一个简单的表格,展示数据集中给定变量的前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 变量对数据进行排序,所有数据都包含在同一个数据框中。


它是否按Var4分组?预期输出是什么? - akrun
嗨@akrun,预期的输出与我在框中编写的内容非常相似,只是行数从4行变成了10行。Var1可以是类似于测试分数之类的东西,而var2-var5将是人口统计数据,例如var2=区域,var3=年龄,var4=班级,var5=性别。 - nikUoM
最好也展示一下,因为描述可能会让人感到困惑。抱歉,我不明白你想要什么。 - akrun
更新了变量名称。 - nikUoM
你想要根据“分数”按“组”分组的前10行吗? - akrun
我基本上只想在数据集中获取前10个最大的分数值,并包括其他4个变量作为参考。没有分组变量。 - nikUoM
5个回答

17

你可以使用dplyr中的arrange实现此操作。如果有分组变量,这也应该起作用。只需在arrange之前添加group_by即可。我们使用slice过滤了前10个观测值。

 library(dplyr)
 df1 %>%
    arrange(desc(Score)) %>%
    slice(1:10) 

或者另一个选择是 ?top_n (由@docendodiscimus评论),它来自dplyr,它是一个包装器,使用filtermin_rank来选择前n(即10)个“分数”条目。

 top_n(df1, 10, Score)    

或者我们使用filter,通过创建一个逻辑条件与row_number结合使用,该函数等同于rank(ties.method='first')(由@Steven Beaupre提供)

 filter(df1, row_number(desc(Score)) <= 10)

还有一个使用data.table的选项(由@David Arenburg提出)。我们将“data.frame”转换为“data.table”(setDT(df1)),按照“Score”变量(降序)order,并选择前10个观测值。 .SD表示DataTable子集

 library(data.table)
 setDT(df1)[order(-Score), .SD[1:10]]

3
或者 top_n(df1, 10, Score) - talat
1
top_n 使用 min_rankrank(ties.method = "min")。如果你想要使用 ties.method = "first" 得到结果,你可以这样做:filter(df1, row_number(desc(Score)) <= 10) - Steven Beaupré
1
我想知道你是否可以添加 setDT(df1)[order(-Score), .SD[1:10]]head(setDT(df1)[order(-Score)], 10) - David Arenburg

15

这应该可以解决...

data <- data[with(data,order(-分数)),]

data <- data[1:10,]


太棒了,这个有效!非常感谢。在R中,括号似乎与Stata中的替换命令有着相似的功能。 - nikUoM
4
也许你可以将其简化为 head(data[order(-data$Score),], 10)。该代码会返回按Score从高到低排名的前10个数据行。 - David Arenburg

2

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

默认情况下,如果存在并列的行,它们也会被选中。如果您想忽略并列的行,严格返回 n 行,请使用 with_ties = FALSE


2
您可以使用以下代码获取向量的最高值:
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

1
使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接