我有一个类似
的矩阵mat <- matrix(sample(100,100,replace=TRUE),nr=10)
我现在想要删除每列的3个最大值,这样我就会得到一个包含7行的新矩阵 我尝试制作每列的向量,然后用
删除那里的3个最大值x1 = x[x!=max(x)]
x2 = x1[x1!=max(x1)]
x3 = x2[x2!=max(x2)]
然后将矢量放入一个新矩阵,但由于我的矩阵有时会有很多列,所以我想找到一种更简单的方法。
谢谢你的帮助
答案 0 :(得分:5)
我们可以使用apply
使用MARGIN=2
,每列sort
遍历列,并使用head
删除三个最高值
apply(mat, 2, FUN=function(x) head(sort(x),-3))
或者,如果我们想保留顺序,请使用rank
获取数字索引,通过与1:3比较获得逻辑索引,否定(!
)并对列进行子集化。
apply(mat, 2, FUN=function(x) x[!rank(-x, ties.method='first') %in% 1:3])