R语言 如果矩阵的每列不为零,则将其除以colSum,而不对大型矩阵进行循环

pgx2nnw8  于 2022-12-20  发布在  其他
关注(0)|答案(4)|浏览(143)

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

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|
slwdgvem

slwdgvem1#

数据:

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

基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)

数据框架法:

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()
myss37ts

myss37ts2#

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
xxe27gdn

xxe27gdn3#

我将使用sweep(),然后替换NA,即

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)
z31licg0

z31licg04#

如果m是您矩阵:

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

相关问题