在R中从数据框(或矩阵)中找出前n个最大的值

3
我有一个如下所示的数据帧:
df = data.frame(a = runif(10,0,10),
            b = runif(10,1,10),
            c = runif(10,0,12))

我该如何从这个数据框中找到前n个最大值? 我们可以轻松地从向量中找到前n个最大值。是否有从数据框中找到前n个最大值的好方法呢? 非常感谢。


那么输出结果是从任何一列中选取的前十个最大值的单一向量? - Marius
请解释一下数据框中的“top n”是什么意思。在R中,数据框是以表格结构排列的不同数据类型的列的列表。因此,默认情况下,“top n”对于数据框没有意义。 - Neel
4个回答

1
也许你可以检查一下 stack
N=2
sort(stack(df)$values, decreasing=TRUE)[1:N]
[1] 10.884644  9.912067

1
你可以使用 tidyr::gather()dplyr::top_n()
首先使用 gather(key, value) 将每一列合并成一列,然后使用 top_n() 过滤出前 n 个元素。例如,前5个。
library(tidyverse) # dplyr and tidyr
set.seed(10)
mydf <- 
  data.frame(a = runif(10,0,10),
            b = runif(10,1,10),
            c = runif(10,0,12))

gather() 中,可以自由指定 keyvalue 的名称。
你应该将 top_n() 中的 wt 命名为你给出的 value
mydf %>% 
  gather(key = "key", value = "value") %>% 
  top_n(5, wt = value) %>% 
  arrange(desc(value)) # sort by value
#>   key value
#> 1   c 10.38
#> 2   c 10.06
#> 3   c  9.30
#> 4   c  9.25
#> 5   b  8.53

您可以获取前n个值的输出,以及相应的列名。

然而,如果你只想要值,你可以使用 unlist() 函数。

unlist(mydf) %>% # optionally, use.names = FALSE
  sort(decreasing = TRUE) %>% 
  .[1:5]
#>    c1    c7    c3    c9   b10 
#> 10.38 10.06  9.30  9.25  8.53

0

我猜你可能在寻找slice_max()函数。

例如,给定以下数据:

> df = data.frame(a = runif(5,0,10),
+                 b = runif(5,1,10),
+                 c = runif(5,-1,9))
> df
         a        b           c
1 1.953615 6.663370  6.95084517
2 1.564794 2.376268  1.46826979
3 5.052276 3.609657  0.84467786
4 3.800541 5.506710  5.64018236
5 9.823815 9.158154 -0.03483406

我们可以通过参数n定义的方式,按列a排序获取前三行...

> slice_max(df, n=3, order_by=a)
         a        b           c
1 9.823815 9.158154 -0.03483406
2 5.052276 3.609657  0.84467786
3 3.800541 5.506710  5.64018236

...列 b...

> slice_max(df, n=3, order_by=b)
         a        b           c
1 9.823815 9.158154 -0.03483406
2 1.953615 6.663370  6.95084517
3 3.800541 5.506710  5.64018236

...或列 c

> slice_max(df, n=3, order_by=c)
         a        b        c
1 1.953615 6.663370 6.950845
2 3.800541 5.506710 5.640182
3 1.564794 2.376268 1.468270

0

unlist并将其转换为向量,sort它们并找到顶部值。因此,对于前两个最大值,我们可以这样做:

tail(sort(unlist(df, use.names = FALSE)), 2)
#[1] 9.581705 9.591726

如果是矩阵,你就不需要使用unlist
tail(sort(as.matrix(df)), 2)

数据

set.seed(1233)
df = data.frame(a = runif(10,0,10),
                b = runif(10,1,10),
                c = runif(10,0,12))

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