R help:每列保留前n个条目

时间:2015-01-22 10:20:40

标签: r apply matrix-math

我再次坚持使用应用或循环可能解决的矩阵操作 我有一个大的数据框,我希望从中保留每列最高值的n个数。但是不应该改变数据框的尺寸。所以我认为这样做是个好主意:
1.找到每列第n个最高数字(在这种情况下:第三高,在其他帖子的帮助下计算出来)

x <- c(0.2, 0.23, 0.35, 0.56, 0.12, 0.7, 0, 0.66, 0.45, 0.21, 0.49, 0.47, 0.1, 0.63, 0.55)
m <- matrix(data = x, nrow=4, ncol = 4)
>m
     [,1] [,2] [,3] [,4]
[1,] 0.20 0.12 0.45 0.47
[2,] 0.23 0.70 0.21 0.10
[3,] 0.35 0.00 0.49 0.63
[4,] 0.56 0.66 0.43 0.55

m.low <- apply(m, 2, function(i) sort(i)[ dim(m)[1]-2])

2。用m替换m.low中的所有值,每列完成。这是我不知道如何继续... 所需的输出应如下所示:

 > m.new
     [,1] [,2] [,3] [,4]
[1,] 0.00 0.12 0.45 0.47
[2,] 0.23 0.70 0.00 0.00
[3,] 0.35 0.00 0.49 0.63
[4,] 0.56 0.66 0.43 0.55

如果有人可以帮助我并在帖子中添加一些功能说明,我将非常感激。此外,如果没有先找到第n个值,可能会有一种更简单的方法。 谢谢!

*编辑m以获得更好的重现性,并添加m.new作为所需的输出。抱歉!

3 个答案:

答案 0 :(得分:2)

f <- function(vec){
  bound = sort(vec)[length(vec)-2]
  vec[which(vec<bound)] = 0
  vec
}
res <- apply(m,2,f)

答案 1 :(得分:1)

您可以尝试将apply与&#34; MARGIN = 2&#34;循环遍历m的列。以下代码类似于您用于&#34; m.low&#34;的代码。除了它使用replace函数将每个列中的元素基于条件参数i < sort(i)..替换为0。

apply(m, 2, function(i) replace(i, i<sort(i)[ dim(m)[1]-2],0))
#      [,1] [,2] [,3] [,4]
#[1,] 0.00 0.12 0.45 0.47
#[2,] 0.23 0.70 0.00 0.00
#[3,] 0.35 0.00 0.49 0.63
#[4,] 0.56 0.66 0.43 0.55

或者来自m.low

m[m <m.low[col(m)]] <- 0

或者创建&#34; indx&#34;使用ave

indx <- !!ave(m, col(m), FUN=function(i) i <sort(i)[dim(m)[1]-2])
m[indx] <- 0

或者您可以将m转换为&#34; data.frame&#34;并使用mutate_each/replace组合

library(dplyr)
as.data.frame(m) %>% 
            mutate_each(funs(replace(., .<sort(.)[2], 0)))

答案 2 :(得分:0)

您可以尝试mapply。为了使它工作,它需要将每个列识别为它自己的元素,这就是为什么我使用有点kludgy as.list(as.data.frame())

mapply( m.low, as.list(as.data.frame(m)), FUN = function(low,col) {
  col[ col < low ] <- 0
  col
} )