R 删除所有值均为0的列

R 删除所有值均为0的列,r,R,我有一个带有15000列的数字矩阵。我想完全删除所有值均为0的列 col1 col2 col3 col4 row1 1 0 0 1 row2 3.4 0 0 2.4 row3 0.56 0 0 0 row4 0 0 0 0 这里我想删除列col2和col3,并保留其余的。 我怎么能用R做呢?

我有一个带有
15000列的数字矩阵。我想完全删除所有值均为
0
的列

     col1     col2     col3     col4
row1  1        0        0        1
row2  3.4      0        0        2.4
row3  0.56     0        0        0
row4  0        0        0        0
 
这里我想删除列
col2
col3
,并保留其余的。 我怎么能用R做呢?
谢谢

使用
apply
all
,怎么样:

M <- as.matrix(data.frame(a=runif(10),b=rep(0,10),c=runif(10),d=rep(0,10)))

M[,which(!apply(M,2,FUN = function(x){all(x == 0)}))]

M做同样事情的更快方法(快3-5倍)是

编辑:添加了这里建议的各种方法的时间细节。@Dwin使用
M[,colSums(abs(M))!==0]
提出的方法似乎工作得最快,尤其是当矩阵较大时。如果提出其他解决方案,我将更新基准测试报告

m <- cbind(rnorm(1000),0)
M <- matrix(rep(m,7500), ncol=15000)

f_joran   = function(M) M[, !apply(M==0,2,all)]
f_ramnath = function(M) M[, colSums(M^2) != 0]
f_ben     = function(M) M[, colSums(M==0) != ncol(M)]
f_dwin    = function(M) M[, colSums(abs(M)) != 0]

library(rbenchmark)
benchmark(f_joran(M), f_ramnath(M), f_ben(M), f_dwin(M), 
   columns = c('test', 'elapsed', 'relative'), 
   order = 'relative', replications = 10)


          test elapsed relative
4    f_dwin(M)  11.699 1.000000
2 f_ramnath(M)  12.056 1.030515
1   f_joran(M)  26.453 2.261133
3     f_ben(M)  28.981 2.477220

m您提到了15000列,但没有提到行数。如果有几千行并且速度是个问题,
colSums
将比
apply
快很多

m <- cbind(rnorm(1000),0)
M <- matrix(rep(m,7500), ncol=15000)
system.time(foo <- M[,which(!apply(M==0,2,all))])
#   user  system elapsed 
#   1.63    0.23    1.86 
system.time(bar <- M[,colSums(M)!=0])
#   user  system elapsed 
#  0.340   0.060   0.413
identical(foo,bar)
# [1] TRUE

m你可以稍微压缩一下:
m[,它(!apply(m==0,2,all))
或者更进一步:
m[,!apply(m==0,2,all)]
Slick。如果数据中没有零,您可以将零替换为NA,转换矩阵,应用
complete.cases
并转换回。只是把它放在那里…@Ramnath:使用
abs()
@Dwin可能比平方快。你是对的
abs()
似乎确实比平方矩阵更快。看我的答案,看看时间。嘿,谢谢你的时间安排。我会断定我错了。3%的差异不值得费心。为了稳健性,我会添加
drop=F
,例如
F_dwin=function(M)M[,colSums(abs(M))!=0,drop=F]
使用
colSums(M)!=0
表示矩阵中可能有负值。啊,没错;我没有看到你的答案。我开始发帖,被打断了,30分钟后就完成了。
m <- cbind(rnorm(1000),0)
M <- matrix(rep(m,7500), ncol=15000)
system.time(foo <- M[,which(!apply(M==0,2,all))])
#   user  system elapsed 
#   1.63    0.23    1.86 
system.time(bar <- M[,colSums(M)!=0])
#   user  system elapsed 
#  0.340   0.060   0.413
identical(foo,bar)
# [1] TRUE