删除R中矩阵中每列的3个最大值

use*_*411 2 r matrix

我有一个像矩阵

mat <- matrix(sample(100,100,replace=TRUE),nr=10)
Run Code Online (Sandbox Code Playgroud)

我现在想删除每列的3个最大值,这样我就会得到一个包含7行的新矩阵.
我尝试制作每列的向量,然后删除那里的3个最大值

x1 = x[x!=max(x)]
x2 = x1[x1!=max(x1)]
x3 = x2[x2!=max(x2)]
Run Code Online (Sandbox Code Playgroud)

然后将矢量放入一个新的矩阵,但由于我的矩阵有时会有很多列,我想找到一个更简单的方法.
谢谢你的帮助

akr*_*run 5

我们可以使用applywith MARGIN=2,sort每列循环遍历列,并删除三个最高值head

apply(mat, 2, FUN=function(x) head(sort(x),-3))
Run Code Online (Sandbox Code Playgroud)

或者,如果我们想保留顺序,则使用rank获取数字索引,通过与1:3比较获得逻辑索引,negate(!)并对列进行子集化.

apply(mat, 2, FUN=function(x) x[!rank(-x, ties.method='first') %in% 1:3])
Run Code Online (Sandbox Code Playgroud)