Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculating within group differences R

Tags:

r

I’m trying to figure out how to append a column that identifies whether a difference of 10 exists between different IDs for a given day using the column named reading.

**Day   ID  Reading**
19-Jan  1   10
19-Jan  1   10
19-Jan  1   10
19-Jan  1   20
19-Jan  2   20
19-Jan  2   20
19-Jan  2   20
19-Jan  2   20
20-Jan  1   10
21-Jan  1   10
22-Jan  1   10
23-Jan  1   10
24-Jan  1   20
25-Jan  2   20
25-Jan  2   20
25-Jan  2   20
25-Jan  2   10

I would like:

**Day   ID  Reading Difference**
19-Jan  1   10  Y
19-Jan  1   10  Y
19-Jan  1   10  Y
19-Jan  1   20  Y
19-Jan  2   20  N
19-Jan  2   20  N
19-Jan  2   20  N
19-Jan  2   20  N
20-Jan  1   10  N
21-Jan  1   10  N
22-Jan  1   10  N
23-Jan  1   10  N
24-Jan  1   20  N
25-Jan  2   20  Y
25-Jan  2   20  Y
25-Jan  2   20  Y
25-Jan  2   10  Y
like image 256
steppermotor Avatar asked Jan 26 '23 18:01

steppermotor


1 Answers

What you could do is to check whether the difference of the range is equal to or greater than 10 for each group.

dat$Diff <- with(dat, ave(Reading, Day, ID, FUN = function(x) diff(range(x)) >= 10))
dat
#      Day ID Reading Diff
#1  19-Jan  1      10    1
#2  19-Jan  1      10    1
#3  19-Jan  1      10    1
#4  19-Jan  1      20    1
#5  19-Jan  2      20    0
#6  19-Jan  2      20    0
#7  19-Jan  2      20    0
#8  19-Jan  2      20    0
#9  20-Jan  1      10    0
#10 21-Jan  1      10    0
#11 22-Jan  1      10    0
#12 23-Jan  1      10    0
#13 24-Jan  1      20    0
#14 25-Jan  2      20    1
#15 25-Jan  2      20    1
#16 25-Jan  2      20    1
#17 25-Jan  2      10    1

data

dat <- structure(list(Day = c("19-Jan", "19-Jan", "19-Jan", "19-Jan", 
"19-Jan", "19-Jan", "19-Jan", "19-Jan", "20-Jan", "21-Jan", "22-Jan", 
"23-Jan", "24-Jan", "25-Jan", "25-Jan", "25-Jan", "25-Jan"), 
    ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 
    2L, 2L, 2L, 2L), Reading = c(10L, 10L, 10L, 20L, 20L, 20L, 
    20L, 20L, 10L, 10L, 10L, 10L, 20L, 20L, 20L, 20L, 10L)), .Names = c("Day", 
"ID", "Reading"), class = "data.frame", row.names = c(NA, -17L
))
like image 96
markus Avatar answered Jan 30 '23 09:01

markus