[R] labels

Barry Rowlingson B.Rowlingson at lancaster.ac.uk
Tue Apr 29 18:26:41 CEST 2003


Anna H. Pryor wrote:
> I don't know how to retain my row labels.  I read in a table with row labels, 
> ie:  
> 
> Price   Floor  Area  Rooms
> 52.      111.   830    5
> 54.      128.   710    5
> 47.4    101   1000   4

  I dont see any row labels. I assume you mean column labels!

> 
> but then I need to transform the data
> 
> raggedRidzeros <- function(x){
> 	 	  
> 	y = list(ridzeros(x[[1]]))
> 	for(i in 2:length(x)){
> 	  y = c(y,list(ridzeros(x[[i]])))
> 	}
> 	y
> 
> }


  This can all be done in one line! Here's some data that does have row 
and column labels:

 > tm
         Foo       Bar Baz
Mercury   1 0.6961034   0
Venus     2 0.3137058   0
Earth     3 0.7692529   1
Mars      0 0.2598111   0
Jupiter   1 0.8375288   0
Saturn    0 0.5866152   0

  Now I want to sweep through columns and return a list without the 
zeroes. I do this:

 > nonZero <- apply(tm,2,function(x){x[x!=0]})

  and I get a list:

$Foo
Mercury   Venus   Earth Jupiter
       1       2       3       1

$Bar
   Mercury     Venus     Earth      Mars   Jupiter    Saturn
0.6961034 0.3137058 0.7692529 0.2598111 0.8375288 0.5866152

$Baz
Earth
     1

  Note this preserves column names (as the names of the list elements, 
so I can do nonZero$Foo), and keeps the row names (as names of 
individual elements).

 > nonZero$Bar['Earth']
     Earth
0.7692529

  How it works:

   function(x){x[x!=0]}   is my 'ridzeros' function.

  I use 'apply(tm,2,function(x){x[x!=0]})' to apply the ridzeros 
function to columns (thats the '2')  of the matrix. To do the same by 
rows, use '1'.

  Hardly rocket science :)

Baz



More information about the R-help mailing list