# [R] Randomly remove condition-selected rows from a matrix

Daniel Malter daniel at umd.edu
Tue Dec 30 16:30:38 CET 2008

```Hi,

The approach below uses a function. The nice thing about it is that you can
define the cutoff values dynamically (i.e. what is 8 and 12 in your
example). The functions extract a row index to remove. Be aware that there
is no warning if both return the same row index. You might have to adjust
for that.

x=1:10
y=11:20
z=cbind(x,y)

a=function(x,m){which(x==sample(x[x<m],1))}
b=function(y,n){which(y==sample(y[y>n],1))}

z[-c(a(x,8),b(y,12)),]

Cheers,
Daniel

Guillaume Chapron-3 wrote:
>
> Hello all,
>
> I create the following matrix:
>
> m <- matrix(1:20, nrow = 10, ncol = 2)
>
> which looks like:
>
>        [,1] [,2]
>   [1,]    1   11
>   [2,]    2   12
>   [3,]    3   13
>   [4,]    4   14
>   [5,]    5   15
>   [6,]    6   16
>   [7,]    7   17
>   [8,]    8   18
>   [9,]    9   19
> [10,]   10   20
>
> Then, I want to remove randomly 2 rows among the ones where m[,1]<8
> and m[,2]>12
>
> I suppose the best way is to use the sample() function. I understand
> how to do it when I remove among any rows, but I have not been able to
> do it when I remove among specific rows only. What I could do is split
> the matrix into two matrices, one with the rows to be sampled and
> removed, one with the other rows. I would sample and remove, and then
> merge the two matrices again. But since this part of the code is going
> to be done many times, I would like to have it the most efficient
> possible without creating new objects. Any idea? Thanks!
>
> Cheers
>
> Guillaume
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help