Skip to content

Create a vector of combinations based on a table column names

3 messages · Henrik Andersson, Eric Lecoutre, Andy Bunn

#
I want to create a character vector based on the table (shortened for 
display) below:
Where there are ones in the matrix I want the column name to appear and 
where there are zeros nothing, which would make the vector in this 
shortened case:

combinations <- ("A B","A C","A E H","A F G","B C D","E G H",A C D E 
H","A C D F G")

     no  value  A  B  C  D  E  F  G   H
1    2  3.095  1  1  0  0  0  0  0   0
2    2  1.687  1  0  1  0  0  0  0   0
46   3  3.470  1  0  0  0  1  0  0   1
47   3  1.563  1  0  0  0  0  1  1   0
50   3  6.234  0  1  1  1  0  0  0   0
148  4  3.663  0  0  1  0  1  0  1   1
151  4  3.470  0  0  0  1  1  1  0   1
177  5  5.411  1  0  1  1  1  0  0   1
178  5  6.829  1  0  1  1  0  1  1   0

Question is how to make this not so manually?

---------------------------------------------
Henrik Andersson
Netherlands Institute of Ecology -
Centre for Estuarine and Marine Ecology
P.O. Box 140
4400 AC Yerseke
Phone: +31 113 577473
h.andersson at nioo.knaw.nl
http://www.nioo.knaw.nl/ppages/handersson
#
Hi,

Here is something that does the job (though I am sure other people will 
find smarter solutions!):


 > samp=matrix(sample(0:1,size=100,replace=TRUE ,prob=c(0.8,0.2)),ncol=10)
 > colnames(samp)<-LETTERS[1:10]
 > unlist(lapply(apply(samp,1,FUN=function(vec) 
colnames(samp)[as.logical(vec)] ),paste,collapse=" "))
  [1] "A F J"   "D I"     "B I"     "A"       "G H"     "B C E H" "E 
H"     "B C E G" "E"
[10] "B C E I"

HTH,

Eric
At 16:40 23/11/2004, Henrik Andersson wrote:
Eric Lecoutre
UCL /  Institut de Statistique
Voie du Roman Pays, 20
1348 Louvain-la-Neuve
Belgium

tel: (+32)(0)10473050
lecoutre at stat.ucl.ac.be
http://www.stat.ucl.ac.be/ISpersonnel/lecoutre

If the statistics are boring, then you've got the wrong numbers. -Edward 
Tufte
#
There has to be a better (more readable) way, but this works...
round(runif(5)))
A B C
1 0 1 1
2 1 1 1
3 1 1 1
4 0 1 1
5 1 1 0
foo.df )[ as.logical( x ) ] ), paste, collapse = ", " )
A B C
1 0 1 1
2 1 1 1
3 1 1 1
4 0 1 1
5 1 1 0
1         2         3         4         5
   "B, C" "A, B, C" "A, B, C"    "B, C"    "A, B"
Those nested applies make my head hurt.

HTH, Andy