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