Hi R-Wizards: I've looking through the R docs and have yet to find what I'm looking for and have tried a few intermediate steps to now avail yet and rather than spend another few hours looking for the solution, I figured I would post a message. I have a matrix (actually a set of them) that I want to pull all the names of the non-zero columns into a vector/list for further processing: d0 d1 d2 s0 s1 s2 s3 [1,] -4.4721360 -447.29878969 -436.18978037 0 0 0 0 [2,] 0.2236068 -25.83121172 -29.21571675 0 0 0 0 [3,] 0.2236068 0.13009088 42.49338060 0 0 0 0 [4,] 0.2236068 0.17155235 0.04891280 0 0 0 0 [5,] 0.2236068 -0.08027479 -0.14749423 0 0 0 0 [6,] 0.2236068 -0.02394758 -0.12845820 0 0 0 0 [7,] 0.2236068 0.03838012 -0.15270556 0 0 0 0 [8,] 0.2236068 0.18150155 -0.17073267 0 0 0 0 [9,] 0.2236068 -0.14047328 -0.11013806 0 0 0 0 [10,] 0.2236068 -0.34247697 -0.05627832 0 0 0 0 [11,] 0.2236068 -0.27058719 0.31379811 0 0 0 0 [12,] 0.2236068 -0.04930450 0.41093718 0 0 0 0 [13,] 0.2236068 0.10968920 0.32996356 0 0 0 0 [14,] 0.2236068 -0.05104658 0.08743581 0 0 0 0 [15,] 0.2236068 -0.19184524 -0.29548841 0 0 0 0 [16,] 0.2236068 -0.06285400 -0.26123732 0 0 0 0 [17,] 0.2236068 -0.52558878 -0.34821174 0 0 0 0 [18,] 0.2236068 0.15258305 -0.10895070 0 0 0 0 [19,] 0.2236068 0.22044668 -0.21442723 0 0 0 0 [20,] 0.2236068 0.51934865 -0.41193918 0 0 0 0 such that I only end up with a list of names (d0,d1,d2). I've been using the qr( x )$rank to get the number of non-zero columns, but I'm not sure how to only return the names of the non-zero columns as> colnames( qr( attr( eval( nlsystemols$eq[[1]]$deriv ), "gradient" ) )$qr )will return> [1] "d0" "d1" "d2" "s0" "s1" "s2" "s3"Is/Are there one of those great S or R function/shortcuts that will return a submatrix(?) or a partioned matrix such that when I call colnames() I get:> [1] "d0" "d1" "d2"Thanks, Jeff.
Does the following meet your requirements: > DF <- data.frame(a=1:2, b=c(0,0)) > DFzeros <- sapply(DF, function(x)all(x==0)) > names(DF)[!DFzeros] [1] "a" hope this helps. spencer graves Jeff D. Hamann wrote:>Hi R-Wizards: > >I've looking through the R docs and have yet to find what I'm looking for >and have tried a few intermediate steps to now avail yet and rather than >spend another few hours looking for the solution, I figured I would post a >message. > >I have a matrix (actually a set of them) that I want to pull all the names >of the non-zero columns into a vector/list for further processing: > > d0 d1 d2 s0 s1 s2 s3 > [1,] -4.4721360 -447.29878969 -436.18978037 0 0 0 0 > [2,] 0.2236068 -25.83121172 -29.21571675 0 0 0 0 > [3,] 0.2236068 0.13009088 42.49338060 0 0 0 0 > [4,] 0.2236068 0.17155235 0.04891280 0 0 0 0 > [5,] 0.2236068 -0.08027479 -0.14749423 0 0 0 0 > [6,] 0.2236068 -0.02394758 -0.12845820 0 0 0 0 > [7,] 0.2236068 0.03838012 -0.15270556 0 0 0 0 > [8,] 0.2236068 0.18150155 -0.17073267 0 0 0 0 > [9,] 0.2236068 -0.14047328 -0.11013806 0 0 0 0 >[10,] 0.2236068 -0.34247697 -0.05627832 0 0 0 0 >[11,] 0.2236068 -0.27058719 0.31379811 0 0 0 0 >[12,] 0.2236068 -0.04930450 0.41093718 0 0 0 0 >[13,] 0.2236068 0.10968920 0.32996356 0 0 0 0 >[14,] 0.2236068 -0.05104658 0.08743581 0 0 0 0 >[15,] 0.2236068 -0.19184524 -0.29548841 0 0 0 0 >[16,] 0.2236068 -0.06285400 -0.26123732 0 0 0 0 >[17,] 0.2236068 -0.52558878 -0.34821174 0 0 0 0 >[18,] 0.2236068 0.15258305 -0.10895070 0 0 0 0 >[19,] 0.2236068 0.22044668 -0.21442723 0 0 0 0 >[20,] 0.2236068 0.51934865 -0.41193918 0 0 0 0 > > >such that I only end up with a list of names (d0,d1,d2). I've been using the >qr( x )$rank to get the number of non-zero columns, but I'm not sure how to >only return the names of the non-zero columns as > > > >>colnames( qr( attr( eval( nlsystemols$eq[[1]]$deriv ), "gradient" ) )$qr ) >> >> > >will return > > > >>[1] "d0" "d1" "d2" "s0" "s1" "s2" "s3" >> >> > >Is/Are there one of those great S or R function/shortcuts that will return a >submatrix(?) or a partioned matrix such that when I call colnames() I get: > > > >>[1] "d0" "d1" "d2" >> >> > >Thanks, >Jeff. > >______________________________________________ >R-help at stat.math.ethz.ch mailing list >https://www.stat.math.ethz.ch/mailman/listinfo/r-help > >
If the columns you want to exclude can only contain all 0s (and not some other values such as 1s), you can do something like: mat[, colSums(mat != 0) > 0] to extract the non-zero columns of the matrix. "mat != 0" gives you a matrix of TRUEs and FALSEs, and colSums() of this matrix tells you how many non-zero elements are in the columns. You just want columns with at least one non-zero entry. HTH, Andy> -----Original Message----- > From: Jeff D. Hamann [mailto:jeff_hamann at hamanndonald.com] > Sent: Monday, October 13, 2003 12:22 PM > To: r-help at stat.math.ethz.ch > Subject: [R] colnames from submatrix? > > > Hi R-Wizards: > > I've looking through the R docs and have yet to find what I'm > looking for and have tried a few intermediate steps to now > avail yet and rather than spend another few hours looking for > the solution, I figured I would post a message. > > I have a matrix (actually a set of them) that I want to pull > all the names of the non-zero columns into a vector/list for > further processing: > > d0 d1 d2 s0 s1 s2 s3 > [1,] -4.4721360 -447.29878969 -436.18978037 0 0 0 0 > [2,] 0.2236068 -25.83121172 -29.21571675 0 0 0 0 > [3,] 0.2236068 0.13009088 42.49338060 0 0 0 0 > [4,] 0.2236068 0.17155235 0.04891280 0 0 0 0 > [5,] 0.2236068 -0.08027479 -0.14749423 0 0 0 0 > [6,] 0.2236068 -0.02394758 -0.12845820 0 0 0 0 > [7,] 0.2236068 0.03838012 -0.15270556 0 0 0 0 > [8,] 0.2236068 0.18150155 -0.17073267 0 0 0 0 > [9,] 0.2236068 -0.14047328 -0.11013806 0 0 0 0 > [10,] 0.2236068 -0.34247697 -0.05627832 0 0 0 0 > [11,] 0.2236068 -0.27058719 0.31379811 0 0 0 0 > [12,] 0.2236068 -0.04930450 0.41093718 0 0 0 0 > [13,] 0.2236068 0.10968920 0.32996356 0 0 0 0 > [14,] 0.2236068 -0.05104658 0.08743581 0 0 0 0 > [15,] 0.2236068 -0.19184524 -0.29548841 0 0 0 0 > [16,] 0.2236068 -0.06285400 -0.26123732 0 0 0 0 > [17,] 0.2236068 -0.52558878 -0.34821174 0 0 0 0 > [18,] 0.2236068 0.15258305 -0.10895070 0 0 0 0 > [19,] 0.2236068 0.22044668 -0.21442723 0 0 0 0 > [20,] 0.2236068 0.51934865 -0.41193918 0 0 0 0 > > > such that I only end up with a list of names (d0,d1,d2). I've > been using the qr( x )$rank to get the number of non-zero > columns, but I'm not sure how to only return the names of the > non-zero columns as > > > colnames( qr( attr( eval( nlsystemols$eq[[1]]$deriv ), "gradient" ) > > )$qr ) > > will return > > > [1] "d0" "d1" "d2" "s0" "s1" "s2" "s3" > > Is/Are there one of those great S or R function/shortcuts > that will return a > submatrix(?) or a partioned matrix such that when I call > colnames() I get: > > > [1] "d0" "d1" "d2" > > Thanks, > Jeff. > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo> /r-help >