# How to extract the closest value to a certain value in each category in an R data frame?

In Data Analysis, we often deal with the comparison of values and this comparison could be also done after finding the closest value to a certain value that might be threshold. For this purpose, we can use filter function of dplyr package along with abs and min function, the abs and min function are required to create the formula for finding the closest value.

Consider the below data frame −

## Example

Live Demo

Category<-sample(LETTERS[1:3],20,replace=TRUE)
Y<-rpois(20,2)
df1<-data.frame(Category,Y)
df1

## Output

  Category Y
1  C       2
2  B       1
3  C       1
4  B       3
5  B       0
6  C       1
7  C       3
8  A       3
9  B       3
10 C       1
11 A       0
12 B       2
13 A       2
14 B       3
15 B       0
16 B       5
17 B       4
18 C       4
19 B       2
20 A       0

Loading dplyr package and finding the closest value to 5 in Y column for each Category −

## Example

library(dplyr)
df1%>%group_by(Category)%>%filter(abs(Y-5)==min(abs(Y-5)))
# A tibble: 3 x 2
# Groups: Category 

## Output

Category Y
<chr> <int>
1 A   3
2 B   5
3 C   4

## Example

Live Demo

Class<-sample(c("I","II","III"),20,replace=TRUE)
Y<-rnorm(20)
df2<-data.frame(Class,Y)
df2

## Output

  Class     Y
1  III     0.8489651
2  I       0.1588493
3  II     -0.4598459
4  I       0.5460653
5  I      -1.2462101
6  II     -1.1553006
7  III     0.1208797
8  I      -0.8272769
9  III    -0.1296539
10 III     0.4404777
11 I      -1.4512669
12 I      -0.1486225
13 II      0.8484109
14 II      0.9099450
15 I       0.6118836
16 III    -1.5100937
17 II     -2.0682287
18 III     0.1454986
19 III    -1.9322351
20 I       0.8039917

Finding the closest value to 0.2 in Y column for each Class −

## Example

df2%>%group_by(Class)%>%filter(abs(Y-0.2)==min(abs(Y-0.2)))
# A tibble: 3 x 2
# Groups: Class 

## Output

Class Y
<chr>    <dbl>
1 I      0.159
2 II     0.848
3 III    0.145