好吧,我有一个矩阵,假设是“ 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
有任何建议吗?
您只能通过在列上进行操作。每列都是一个向量,您可以在分位数上方选择子值以将其替换为分位数:
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
一个选项是:
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