Returning a true value if it is a close match among different columns in r

This looks at 1.05 times the minimum values is less than the 0.95 times the maximum value for each of the rows. (I assumed that's what you meant by within %5 of each other.)

sapply(1:nrow(df1), function(i) (min(df1[i, 2:4]) * 1.05) >
(0.95 * max(df1[i, 2:4])))
# [1]  TRUE FALSE FALSE FALSE FALSE


Slightly different way to do the same.

sapply(1:nrow(df1), function(i) diff(range(df1[i, 2:4]) *
c(1.05, 0.95)) <= 0)
# [1]  TRUE FALSE FALSE FALSE FALSE


Does this work:

library(dplyr)
library(data.table)
df1 %>% rowwise() %>% mutate(new_col = case_when(between(d, 0.95*b, 1.05*b) & between(e, 0.95*d, 1.05*d) ~ 'TRUE', TRUE ~ 'FALSE'))
# A tibble: 5 x 5
# Rowwise:
a         b     d     e new_col
<chr> <dbl> <dbl> <dbl> <chr>
1 id1       5   5.2   5.4 TRUE
2 id2      10 150     0   FALSE
3 id3       7 123    10   FALSE
4 id4       2   5     3   FALSE
5 id5       3   7     5   FALSE


Is this what you're after?

a <- c('id1','id2','id3','id4','id5')
b <- c(5,10,7,2,3)
d <- c(5.2,150,123,5,7)
e <- c(5.4,0,10,3,5)

df1 <- data.frame(a,b,d,e)
library(tidyverse)
df1 %>%
mutate(new_col = ifelse((b >= (0.95 * d) & b <= (1.05 * d) & d >= (0.95 * e) & d <= (1.05 * e)),
"TRUE", "FALSE"))

a  b     d    e new_col
1 id1  5   5.2  5.4    TRUE
2 id2 10 150.0  0.0   FALSE
3 id3  7 123.0 10.0   FALSE
4 id4  2   5.0  3.0   FALSE
5 id5  3   7.0  5.0   FALSE