## Is there an R function for finding the index of an element in a vector?

The function `match`

works on vectors:

`x <- sample(1:10)`

x

# [1] 4 5 9 3 8 1 6 10 7 2

match(c(4,8),x)

# [1] 1 5

`match`

only returns the first encounter of a match, as you requested. It returns the position in the second argument of the values in the first argument.

For multiple matching, `%in%`

is the way to go:

`x <- sample(1:4,10,replace=TRUE)`

x

# [1] 3 4 3 3 2 3 1 1 2 2

which(x %in% c(2,4))

# [1] 2 5 9 10

`%in%`

returns a logical vector as long as the first argument, with a `TRUE`

if that value can be found in the second argument and a `FALSE`

otherwise.

## How to find indices of element in one vector in other vector R

`a <- c('Q1', 'Q2', 'Q3')`

b <- c('Q10', 'Q13', 'Q1', 'Q1', 'Q40', 'Q2', 'Q2', 'Q2')

which(b %in% a)

[1] 3 4 6 7 8

## Get index of a specific element in vector using %% operator

You can refer the left-hand side (lhs) of the pipe using the dot (`.`

). There's two scenarios for this:

You want to use the lhs as an argument that is not in the first position. A common example is use of a

`data`

argument:`mtcars %>% lm(mpg~cyl, data = .)`

In this case,

`margrittr`

will not inject the lhs into the first argument, but only in the argument marked with`.`

.You want to include the lhs not as a single function argument, but rather as part of an expression. This is your case! In this case

`magrittr`

will still inject the lhs as the first argument as well. You can cancel that with the curly braces (`{`

).

So you need to use `.`

notation with `{`

braces:

`x %>% { which(. == "peach") }`

[1] 3

Excluding the `{`

would lead to trying to run the equivalent of `which(x, x == "peach")`

, which yields an error.

## Finding the interval of the index of a vector in which values are increasing, decreasing, or remaining constant

You can use the base R `diff`

, `sign`

and `which`

functions to identify the element pairs with sign change differences:

`x <- my_vector`

z1 <- diff(x)

z2 <- sign(z1)

z3 <- diff(z2)

no_change <- which(z3 == 0)

no_change

minus_change <- which(z3 < 0)

minus_change

[1] 74 134

plus_change <- which(z3 > 0)

plus_change

[1] 4 104

In this case there are no zero sign changes. Note that for a vector of length n, the diff and sign vectors contain n-1 elements. So for example the minus_change values of 74, 134 represent the sign differences of the x[75:76] and x[135:136] pairs. See the help info for the R functions.

## Is the right function an R for finding row index of an elements from a vector in a data.frame?

`# Dummy data`

vector = c(1,2,10,400) # Vector of numbers want to find in df

df = data.frame(data = seq(1,100,1), random = "yee") # dummy df

# Loop to match vector numbers with data frame - on match save data frame row

grab_row = list() # Initialize output list

for (i in 1:nrow(df)){

if(df$data[i] %in% vector) { # Check that any number in the vector is in the data frame column

grab_row[[i]] = df[i,] # if TRUE, grab the data frame row

}

} # end

# Output df with rows that matched vector

out = do.call(rbind,grab_row)

For the output

` data random`

1 1 yee

2 2 yee

10 10 yee

## Closest subsequent index for a specified value

Find the location of each value (numeric or character)

`int = c(1, 1, 0, 5, 2, 0, 0, 2)`

value = 0

idx = which(int == value)

## [1] 3 6 7

Expand the index to indicate the nearest value of interest, using an NA after the last value in `int`

.

`nearest = rep(NA, length(int))`

nearest[1:max(idx)] = rep(idx, diff(c(0, idx))),

## [1] 3 3 3 6 6 6 7 NA

Use simple arithmetic to find the difference between the index of the current value and the index of the nearest value

`abs(seq_along(int) - nearest)`

## [1] 2 1 0 2 1 0 0 NA

Written as a function

`f <- function(x, value) {`

idx = which(x == value)

nearest = rep(NA, length(x))

if (length(idx)) # non-NA values only if `value` in `x`

nearest[1:max(idx)] = rep(idx, diff(c(0, idx)))

abs(seq_along(x) - nearest)

}

We have

`> f(int, 0)`

[1] 2 1 0 2 1 0 0 NA

> f(int, 1)

[1] 0 0 NA NA NA NA NA NA

> f(int, 2)

[1] 4 3 2 1 0 2 1 0

> f(char, "A")

[1] 0 2 1 0 0

> f(char, "B")

[1] 1 0 NA NA NA

> f(char, "C")

[1] 2 1 0 NA NA

The solution doesn't involve recursion or R-level loops, so should e fast even for long vectors.

## Finding the index values for a combination of vectors

Both conditions define logical vectors so AND them and get `which`

indices they correspond to. Then plot.

I have added color to make the text labels more obvious.

`max_hat <- boxplot.stats(hat, coef = 2)$stats[5]`

i <- abs(rs) > 1.96 # abs() because +/-1.96 are

# symmetric values

j <- hat > max_hat

k <- which(i & j)

plot(hat, rs, cex = 0.2+3*sqrt(x), pch = 19)

text(hat[k], rs[k], labels = names(k), pos = 2, col = "red")

## How to get the index of elements in a matrix that match values of a vector

Here's a function in base R to do this -

`match_a_row <- function(data, var1, var2) {`

which(data[[1]] == var1 & data[[2]] == var2)

}

match_a_row(m, 'exponential', 'logit')

#[1] 2

match_a_row(m, 'independent', 'probit')

#[1] 8

### Related Topics

Pass a String as Variable Name in Dplyr::Filter

How to Join (Merge) Data Frames (Inner, Outer, Left, Right)

How to Read Data When Some Numbers Contain Commas as Thousand Separator

How to Use a Variable to Specify Column Name in Ggplot

Collapse/Concatenate/Aggregate a Column to a Single Comma Separated String Within Each Group

Order Bars in Ggplot2 Bar Graph

Error: Could Not Find Function ... in R

Difference Between Require() and Library()

Formatting Decimal Places in R

Replacing Nas With Latest Non-Na Value

How to Import Multiple .Csv Files At Once

Filter Data.Frame Rows by a Logical Condition

Split Column At Delimiter in Data Frame

Pass a Data.Frame Column Name to a Function

Sample Random Rows in Dataframe

How to Arrange a Variable List of Plots Using Grid.Arrange

Create Grouping Variable For Consecutive Sequences and Split Vector