首页 > 解决方案 > 如何避免使用每个元素的函数循环转换矩阵

问题描述

好吧,我有一个矩阵,比如说“A”(5x3)。每列是一个变量,每一行是一个观察值。我的目标是清理 A 中关于分配分位数值的每个变量超过 75% 分位数的那些观察值的数据。

我尝试使用“APPLY”函数定义一个带有向量作为输入的 FUN,但它不起作用。

> A
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
[3,]    3    8   13
[4,]    4    9   14
[5,]    5   10   15

f2 <- function(x1, x2) {
  if (x1>x2){
    return(x2)} else {
      return(x1)
    }
  }

B <- apply(A, 1:2, FUN = f2, x2=apply(A, 2, quantile, probs=0.75))

我想得到一个这样的矩阵:

> B
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
[3,]    3    8   13
[4,]    4    9   14
[5,]    4    9   14

但我收到了这个警告:

There were 15 warnings (use warnings() to see them)
> B
     [,1]      [,2]      [,3]     
[1,] 1         3         Numeric,3
[2,] 2         4         Numeric,3
[3,] 3         Numeric,3 Numeric,3
[4,] 4         Numeric,3 Numeric,3
[5,] Numeric,3 Numeric,3 Numeric,3

有什么建议吗?

标签: r

解决方案


您只能通过处理列来做到这一点。每列都是一个向量,您可以选择分位数上方的值以用分位数替换它们:

A <- matrix(c(1:5,3,4,8,9,10,5,6,13,14,15),ncol = 3)

apply(A,2,function(col){
  col[col > quantile(col,probs = 0.75)] <- quantile(col,probs = 0.75)
  col
  })

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
[3,]    3    8   13
[4,]    4    9   14
[5,]    4    9   14

推荐阅读