# [R] Selecting values based on two criteria

Boris Steipe boris.steipe at utoronto.ca
Fri Dec 26 23:22:38 CET 2014

```Try this:

d1 <- c(135631,136950,137952,138787,139623,142231,143067,144762,
145601,146441)

d2 <- c(135882,136954,137956,138792,139630,140569,141398,142237,
143078,143907,144771,145611,146446,147285,148128)

len <- length(d1)

# concatenate the two vectors
mrg <- c(d1,d2)

# order the concatenated vector
ord <- order(mrg)

# Look at the result: the indices > len (10) are numbers from d2.
ord   #   1 11  2 12  3 13  4 14  5 15 16 17  6 18  7 19 20  8 21  9 22 10 23 24 25

# Thus you are looking for values in ord that are > len,
# and immediately follow a value that is <= len.

# Initialize a result vector (you could also overwrite d1).
d4 <- rep(NULL, len)

# A counting index ...
ind <- 0

# Slowly, element by element. If your vectors are very large you might
# use apply.

for (i in 1:length(ord)) {
if (ord[i] > len && ord[i-1] <= len) {
ind <- ind + 1
d4[ind] <- mrg[ord[i]]
}
}

d3 <- c(135882,136954,137956,138792,139630,142237,143078,144771,
145611,146446)

identical(d3, d4)
# TRUE

# special cases you may need to consider:
# - what if there are values in d1 that are equal to values in d2
# - negative values?
# - what if min(d2) is smaller than than min(d1)?

Cheers,
B.

On Dec 26, 2014, at 4:16 PM, Morway, Eric <emorway at usgs.gov> wrote:

> I'm in need of help selecting from d2 those values that come after a value
> in d1.  For example, d2 is both greater than d1 and is the value that
> is closest to d2.  Similarly, d2 is both greater than d1 and is
> the next "highest" number in d2.  Every value in d1 has a corresponding
> value in d2 based on this criteria, however, many of the values in d2 will
> be discarded.  The final result I'm looking for is a subset of d2 as given
> in d3.  Notice for example that 140569 is discarded and not contained in
> d3.  This small example is of course a much smaller example of a much
> larger problem.  Example R script of how to whittle down d2 to look like d3
> based on the criteria above
>
> d1 <- c(135631,136950,137952,138787,139623,142231,143067,144762,
>        145601,146441)
>
> d2 <- c(135882,136954,137956,138792,139630,140569,141398,142237,
>        143078,143907,144771,145611,146446,147285,148128)
>
> d3 <- c(135882,136954,137956,138792,139630,142237,143078,144771,
>        145611,146446)
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help