如何避免对每个元素使用函数来循环变换矩阵

问题描述 投票:1回答:2

好吧,我有一个矩阵,假设是“ A”(5x3)。每列都是变量,每行都是观察值。我的目标是针对分配了分位数值的每个变量,针对那些超过75%的分位数的观察结果,清理A中的数据。

我试图使用“ 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
2个回答
0
投票

您只能通过在列上进行操作。每列都是一个向量,您可以在分位数上方选择子值以将其替换为分位数:

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

0
投票

一个选项是:

A <- matrix(1:15,5,3)
q <- apply(A, 2, function(x) quantile(x)[4])
A <- sapply(1:ncol(A), function(x) ifelse(A[,x] > q[x], q[x], A[,x]))

输出

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    2    7   12
[3,]    3    8   13
[4,]    4    9   14
[5,]    4    9   14
© www.soinside.com 2019 - 2024. All rights reserved.