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