I have a matrix whose rows I want to extract based on whether the elements of one of its columns is a member of another vector (calling it the "comparison vector"). I would like to get better at using functional programming, and so I want to avoid using a loop, if it´s possible. I believe I have the right functions: Select
and MemberQ
. But I can´t coerce MemberQ to compare the element of the matrix to each element of the comparison vector.
If there´s a duplicate answer, I´m willing to be lead to it (I´ve searched though)...
Addition to my question:
mymatrix={{1, 1, -56}, {1, 2, 3.06}, {2, 0, -30.02}, {3, 1, -7.291}, {3, 2,1.93}, {4, 0, 0}, {5, 0, 0}, {5, 1, -356.4}, {6, 1, 9.945}, {7,0, -7.512}};
compvector={1,2,6,7,11,12,16,17};
I would like to extract the rows of ´mymatrix´ based on whether the values of the first column of ´mymatrix´ are in ´compvector´.
Answer
New solution
Cases[mymatrix, {x_, _, _} /; MemberQ[compvector, x]]
{{1, 1, -56}, {1, 2, 3.06}, {2, 0, -30.02}, {6, 1, 9.945}, {7, 0, -7.512}}
I do not take credit for this solution, someone posted this here before me but in the confusion over what the problem was that person (whose name I do not remember) deleted his answer :(
Here's another answer that does not use Cases
.
First let's define what columns are required to be in compvector
, first and second for example:
required = {True, True, False}
Then
Select[mymatrix, And @@ (MemberQ[compvector, #] & /@ Pick[#, required]) &]
{{1, 1, -56}, {1, 2, 3.06}, {6, 1, 9.945}}
If the requirement is just that a specific column should exist, this can obviously be made a lot simpler. See aky's answer.
The complaint for the first version was that if there are many columns the pattern would also be very long, {x_,_,_,_ ...
: this is not really true, one could write a short pattern to match such a list.
Old solution, not what the OP wants
First define some test data:
comparison = Range[10]
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
matrix = RandomInteger[100, {10, 5}]
{{46, 51, 84, 49, 52}, {12, 22, 7, 51, 56}, {74, 61, 9, 23, 93}, {97, 0, 23, 87, 78}, {23, 29, 83, 68, 21}, {79, 1, 25, 13, 84}, {23, 85,
35, 83, 83}, {2, 29, 50, 22, 88}, {34, 61, 91, 84, 29}, {60, 51, 96,
48, 68}}
The test:
Select[matrix, Length[Intersection[comparison, #]] > 0 &]
{{12, 22, 7, 51, 56}, {74, 61, 9, 23, 93}, {79, 1, 25, 13, 84}, {2,
29, 50, 22, 88}}
Comments
Post a Comment