【问题标题】:Subset data frame to only include the nth highest value of a column将数据框设置为仅包含列的第 n 个最高值
【发布时间】:2015-03-24 16:13:59
【问题描述】:

我有一个数据框 abc,并希望将数据框子集化为仅包含某个变量“z”的第 n 个最高值的行。我知道这里有一个简单的解决方案:

       library(plyr)
       abc <- arrange(abc, z)
       abc <- abc[n,]

但是有没有办法在不先排序数据框的情况下做到这一点?我只是问,因为在较大的数据帧上排序似乎很昂贵。

这是一个可以使用的示例 df:

    x  y   z
1   2  1 111
2   3  2 112
3   4  3 113
4   5  4 114
5   6  5 115
6   7  6 116
7   8  7 117
8   9  8 118
9  10  9 119
10 11 10 120

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    你可以试试

    library(dplyr)
    n <- 7
    slice(abc, rank(z)[n])
    

    或者正如@nicola 评论的那样,base R 选项将是

    abc[rank(abc$z)==n,]
    

    更新

    如果你想要排名上升的第 n 高

     slice(abc, rank(-z)[n])
     #  x y   z
     #1 5 4 114
     abc[nrow(abc)-rank(abc$z)+1==n,]
     #  x y   z
     #4 5 4 114
    

    【讨论】:

    • 或者没有dplyrabc[rank(abc$z)==n,]
    • 由于某种原因,我的 dplyr 版本没有幻灯片功能。我重新安装它以确保它是最新的,但我收到错误?
    • @Ben 我正在使用dplyr_0.4.1.9000 slice 应该很快
    • @Ben 基于slice 之前的一些基准测试,它非常快,虽然还没有使用nicola 的版本进行测试。
    • 也许他正在搜索第 n 高并且rank 不断增加。如果是这样的话,也许abc[nrow(abc)-rank(abc$z)+1==n,] 是正确的。
    猜你喜欢
    • 2018-12-14
    • 2021-11-29
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2019-02-21
    • 2015-06-21
    相关资源
    最近更新 更多