1
$\begingroup$
 m={{"","N1","N2","N3","N4","N5","N6","N7","N8","N9","N10","N11","N12","N13","N14","N15","N16","N17","N18","N19","N20","N21","N22","N23","N24","N25","N26","N27","N28","N29","N30","N31","N32","N33","N34","N35","N36","N37","N38","N39","N40","N41","N42","N43"},{"N1",0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{"N2",0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}
MatrixForm[m]

For example, Column N5 has a 1 in rows N1 and N2. I would like to have a list printed that shows by each Column name the list of row names that contain a 1. So, column N5 has a 1 in rows {N1, N2} and column N1 has a 1 only in row {N1}, and so forth

$\endgroup$
1
  • $\begingroup$ Have a look for the built-in function Position. $\endgroup$ Commented Apr 4, 2018 at 16:31

2 Answers 2

1
$\begingroup$

two ways i can think of with your current m:

g[{0, 0}] = {};
g[{1, 0}] = {"N1"}; 
g[{0, 1}] = {"N2"};
g[{1, 1}] = {"N1", "N2"};  

Map[First@# -> g@Rest@# &, Rest@Thread[m]] // AbsoluteTiming

(* {0.000065641, {"N1" -> {}, "N2" -> {}, "N3" -> {}, "N4" -> {"N1"}, 
"N5" -> {"N1", "N2"}, "N6" -> {"N1"}, "N7" -> {"N1"}, 
"N8" -> {"N1"}, "N9" -> {"N1"}, "N10" -> {}, "N11" -> {}, 
"N12" -> {}, "N13" -> {}, "N14" -> {}, "N15" -> {}, "N16" -> {}, 
"N17" -> {}, "N18" -> {}, "N19" -> {}, "N20" -> {}, "N21" -> {}, 
"N22" -> {}, "N23" -> {}, "N24" -> {}, "N25" -> {}, "N26" -> {}, 
"N27" -> {}, "N28" -> {}, "N29" -> {}, "N30" -> {}, "N31" -> {}, 
"N32" -> {}, "N33" -> {}, "N34" -> {}, "N35" -> {}, "N36" -> {}, 
"N37" -> {}, "N38" -> {}, "N39" -> {}, "N40" -> {}, "N41" -> {}, 
"N42" -> {}, "N43" -> {}}} *)

or using Replace

 Replace[Rest@*Thread@m, {{x_, 1, 0} :> x -> {"N1"}, 
{x_, 0, 1} :> x -> {"N2"}, {x_, 1, 1} :> x -> {"N1", "N2"}, {x_, __} :> x -> {}}, {1}]
$\endgroup$
0
$\begingroup$

You could do it this way:

rowtitles = m[[2 ;;, 1]];
coltitles = m[[1, 2 ;;]];
A = Developer`ToPackedArray[m[[2 ;;, 2 ;;]]];
MapThread[
 {col, title} \[Function] title -> Extract[rowtitles, Position[col, 1]],
 {
  Transpose[A],
  coltitles
  }
 ]

{"N1" -> {}, "N2" -> {}, "N3" -> {}, "N4" -> {"N1"}, "N5" -> {"N1", "N2"}, "N6" -> {"N1"}, "N7" -> {"N1"}, "N8" -> {"N1"}, "N9" -> {"N1"}, "N10" -> {}, "N11" -> {}, "N12" -> {}, "N13" -> {}, "N14" -> {}, "N15" -> {}, "N16" -> {}, "N17" -> {}, "N18" -> {}, "N19" -> {}, "N20" -> {}, "N21" -> {}, "N22" -> {}, "N23" -> {}, "N24" -> {}, "N25" -> {}, "N26" -> {}, "N27" -> {}, "N28" -> {}, "N29" -> {}, "N30" -> {}, "N31" -> {}, "N32" -> {}, "N33" -> {}, "N34" -> {}, "N35" -> {}, "N36" -> {}, "N37" -> {}, "N38" -> {}, "N39" -> {}, "N40" -> {}, "N41" -> {}, "N42" -> {}, "N43" -> {}}

Moreover, I would strongly discourage to store column and row titles within the data matrix since this disables packing of arrays. For instance, compare

ByteCount[m] 

ByteCount[A]

4160

816

$\endgroup$
2
  • $\begingroup$ very clever and helpful ... thank you $\endgroup$
    – user42700
    Commented Apr 5, 2018 at 11:30
  • $\begingroup$ You're welcome! $\endgroup$ Commented Apr 5, 2018 at 11:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.