# matching sub-vectors?

14 views

### amit gal

Aug 18, 2018, 12:47:58 AM8/18/18

so R has a great function, match, to find values in vectors (also %in% to test the existence). but what if I want to find a short vector in a big vector? that is, to test if a given vector is contained (in order!) in another vector? what if I want to find whether a given vector is a prefix/suffix of another vector? are there such functions in R?

example of what I would like:

``````x=c(1,3,4)
y=c(4,1,3,4,5)
z=c(3,1)

v_contains(x,y)  # return TRUE x is contained in y
v_contains(z,y)  # FALSE the values of z are in y, but not in the right order
v_match(x,y)     # returns 2 because x appears in y starting at position 2``````

is there anything like it? how would you approach it efficiently?

### Michael Dorman

Aug 18, 2018, 3:42:32 AM8/18/18
If the vectors are always composed of single-digit numbers then I would use paste0(x, collapse = "") on both vectors and then gsub. This approach is also applicable with longer numbers if we add leading zeros before using paste0, but perhaps will be less efficient. Otherwise would look for a C/C++ function and use it with Rcpp.

--
You received this message because you are subscribed to the Google Groups "Israel R User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to israel-r-user-group+unsub...@googlegroups.com.

### amit gal

Aug 18, 2018, 4:41:26 AM8/18/18
the string method is not applicable in my case due to efficiency.

However after some thought, I did exploit another property of my vectors - in each vector values do not repeat

so for x to be fully contained in y
match(x,y) must be a series of consecutive numbers
so
all(diff(match(x,y))==1)
does what I need.

To unsubscribe from this group and stop receiving emails from it, send an email to israel-r-user-group+unsubscribe...@googlegroups.com.