delif
==============================================
Purpose
----------------
Deletes rows from a matrix. The rows deleted are
those for which there is a 1 in the corresponding
row of *e*.
Format
----------------
.. function:: new_x = delif(x, e)
:param x: data
:type x: NxK matrix
:param e: vector of 0's and 1's
:type e: Nx1 logical vector
:return new_x: consisting of the rows of *x* for
which there is a 0 in the corresponding row of
e. If no rows remain, :func:`delif` will return a scalar missing.
:rtype new_x: MxK matrix
Examples
----------------
Basic usage with column vector
++++++++++++++++++++++++++++++
::
// Create column vector
x = { 1.5,
0.8,
0.7,
1.2,
1.9,
0.2,
2.0 };
// Create logical vector of 1's and 0's
e = x .> 1;
/*
** Assign 'new_x' to be equal to 'x'
** with the rows removed in which 'e' equals 1
*/
new_x = delif(x, e);
After the code above, *new_x* should equal:
::
0.8
0.7
0.2
Matrix case
+++++++++++
In this example, we will remove all observations in which the value of the third column is 3.
::
// Create a matrix with 3 columns
x = { 20 10 2,
33 13 3,
37 12 2,
34 12 3,
35 8 1,
25 15 2,
34 8 2,
37 8 1,
37 3 1,
31 4 1 };
// Create logical vector of 1's and 0's
e = x[., 3] .== 3;
/*
** Assign 'new_x' to be equal to 'x' without
** the rows in which the third column equals 3
*/
new_x = delif(x, e);
After the code above, *new_x* should be equal to:
::
20 10 2
37 12 2
35 8 1
25 15 2
34 8 2
37 8 1
37 3 1
31 4 1
Create new 'x' and 'y' based on 'y'
+++++++++++++++++++++++++++++++++++
In this example, we will remove all observations from *x* and *y* in which the value of the third column of *y* is 2.
::
// Create 'y' matrix
y = { 1,
1,
0,
2,
0,
1,
1,
0,
0,
2 };
// Create 'x' matrix
x = { 1.6841 -0.1203,
-1.0433 0.2564,
1.2207 -1.4388,
0.7423 0.2133,
0.7288 1.0434,
0.8115 1.8166,
-0.3230 1.4763,
1.2944 0.7635,
1.3839 0.6648,
-0.6330 0.4845 };
// Create logical vector of 1's and 0's
e = y .== 2;
/*
** Assign 'new_x' to be equal to 'x' without
** the rows in which 'y' equals 2
*/
new_x = delif(x, e);
// Remove all observations in which 'y' equals 2
new_y = delif(y, e);
After the code above, *new_y* and *new_x* should equal:
::
new_y = 1 new_x = 1.6841 -0.1203
1 -1.0433 0.2564
0 1.2207 -1.4388
0 0.7288 1.0434
1 0.8115 1.8166
1 -0.3230 1.4763
0 1.2944 0.7635
0 1.3839 0.6648
Logical comparison of multiple columns
++++++++++++++++++++++++++++++++++++++
::
x = { 0 10 20,
30 40 50,
60 70 80 };
// Logical vector, comparing two columns
e =(x[., 1] .gt 0) .and (x[., 3] .lt 100);
new_x = delif(x, e);
After the code above:
::
new_x = 0 10 20
Remarks
-------
The input *e* will usually be generated by a logical expression using dot
operators. For instance:
::
/*
** Create a vector 'e' with a 1 for each row in which the
** value in the second column of 'x' is less than 100,
** otherwise a 0
*/
e = x[., 2] .> 100;
new_x = delif(x, e);
Or the equivalent statement:
::
new_x = delif(x, x[., 2] .> 100);
will delete all rows of *x* whose second element is greater than 100. The
remaining rows of *x* will be assigned to *y*.
.. seealso:: Functions :func:`selif`