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

R ProgrammingServer Side ProgrammingProgramming

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 [3]

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 [3]

Output

Class Y
<chr>    <dbl>
1 I      0.159
2 II     0.848
3 III    0.145
raja
Published on 10-Feb-2021 10:43:55
Advertisements