r语言 - 如果矩阵的每一列不为零,则除其colsum,对于大矩阵不进行循环



我有一个巨大的矩阵,我需要将它的每一列除以它的和(如果它不为零)。我使用了循环,但由于矩阵非常大,需要很长时间才能完成。

sum_D<- colSums(R_t)
for(i in 1:NR){
if(sum_D[i]>0){
R_t[,i]<-c(as.numeric(R_t[,i])/sum_D[i]) 
}
} 

那么我写了这段代码,但它的结果不是一个矩阵。

matrixp<- apply(X=R_1, MARGIN=2, FUN=ColpSum)
ColpSum<-function(x){
x<-as.matrix(x)
if(colSums(x)==0){
return(0)
}
else{
return(x/colSums(x))
}
}

我该如何解决这个问题?

例如:

|1|2|3|4|
|:----|:----|:----|:----|
|2|0|0|0|
|0|1|0|0|
|0|1|0|0|

结果:

|1|2|3|4|
|:----|:----|:----|:----|
|1|0|0|0|
|0|0.5|0|0|
|0|0.5|0|0|

data:

test_matrix <- matrix(c(1,2,3,0,0,0,3,2,1),nrow=3)

base R方法:

ColSum2<-function(x){
#x<-as.matrix(x)
if(sum(x)==0){
return(1)
}
else{
return(sum(x))
}
}
sum_value <- apply(test_matrix,2,ColSum2)
t(t(test_matrix)/sum_value)

data.frame方法:

ColpSum<-function(x){
#x<-as.matrix(x)
if(sum(x)==0){
return(0)
}
else{
return(x/sum(x))
}
}
library(dplyr)
test_matrix%>%as.data.frame()%>%mutate_all(ColpSum)%>%as.matrix()

x        <- matrix(c(2,0,0,0,1,1,0,0,0,0,0,0), nrow = 3L)
cs_x     <- colSums(x)
cols2div <- which(cs_x > 0)
x[, cols2div] <- vapply(cols2div, (i) x[, i] / cs_x[i], numeric(nrow(x)))
[,1] [,2] [,3] [,4]
[1,]    1  0.0    0    0
[2,]    0  0.5    0    0
[3,]    0  0.5    0    0

我会使用sweep(),然后替换NAs,即

m3 <- sweep(m2, 2, colSums(m2), '/')
m3[] <- replace(m3, is.na(m3), 0)

[,1] [,2] [,3] [,4]
[1,]    1  0.0    0    0
[2,]    0  0.5    0    0
[3,]    0  0.5    0    0

structure(c(2, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0), dim = 3:4)

如果m是您的矩阵:

cs <- colSums(m)
cs[cs == 0] = 1
apply(m, 1, (row) row/cs)

相关内容

  • 没有找到相关文章

最新更新