library(magrittr)
library(dplyr)
library(tibble)

Generate sample dataset

SN <- c(1,2,3,4,5)
test <- c(1,2,3)
group <- c('A', 'B')

col_SN <- rep(SN, times=length(test)*length(group))
col_test <- rep(test, each=length(SN), times=length(group))
col_group <- rep(group, each=length(SN)*length(test))
nrows <- length(col_SN)

sample_data <- tibble(SN = col_SN, TestNum = col_test, Group = col_group)
sample_data %<>% add_column(Val1 = round(abs(rnorm(nrows, mean = 0, sd = 1.05)), 3))
sample_data %<>% add_column(Val2 = sample.int(9, nrows, replace = TRUE))
sample_data %<>% add_column(Val3 = sample.int(100, nrows))
sample_data %>% print(n = Inf)
## # A tibble: 30 x 6
##       SN TestNum Group  Val1  Val2  Val3
##    <dbl>   <dbl> <chr> <dbl> <int> <int>
##  1     1       1 A     1.53      3    10
##  2     2       1 A     0.513     9    30
##  3     3       1 A     0.159     3     4
##  4     4       1 A     1.10      4     9
##  5     5       1 A     0.048     5    53
##  6     1       2 A     0.567     1    26
##  7     2       2 A     0.814     1    91
##  8     3       2 A     0.125     8    93
##  9     4       2 A     0.461     7    33
## 10     5       2 A     3.73      6    42
## 11     1       3 A     0.466     8    38
## 12     2       3 A     1.19      2    75
## 13     3       3 A     2.21      6    54
## 14     4       3 A     0.476     1    15
## 15     5       3 A     0.901     6    85
## 16     1       1 B     1.76      1    47
## 17     2       1 B     0.791     7    43
## 18     3       1 B     0.053     3    18
## 19     4       1 B     0.152     3     8
## 20     5       1 B     0.763     7    48
## 21     1       2 B     0.919     1    24
## 22     2       2 B     0.695     9    50
## 23     3       2 B     0.351     5    58
## 24     4       2 B     0.911     4    92
## 25     5       2 B     0.152     6    71
## 26     1       3 B     0.49      6    41
## 27     2       3 B     0.63      7    72
## 28     3       3 B     0.529     6    82
## 29     4       3 B     1.02      8    64
## 30     5       3 B     0.862     4    31

Processing

Try if we can correctly extract 1st test value of each SN per group using first():

sample_data %>% 
  group_by(Group, SN) %>% 
  mutate(Val1_delta = first(Val1)) %>%
  print(n = Inf)
## # A tibble: 30 x 7
## # Groups:   Group, SN [10]
##       SN TestNum Group  Val1  Val2  Val3 Val1_delta
##    <dbl>   <dbl> <chr> <dbl> <int> <int>      <dbl>
##  1     1       1 A     1.53      3    10      1.53 
##  2     2       1 A     0.513     9    30      0.513
##  3     3       1 A     0.159     3     4      0.159
##  4     4       1 A     1.10      4     9      1.10 
##  5     5       1 A     0.048     5    53      0.048
##  6     1       2 A     0.567     1    26      1.53 
##  7     2       2 A     0.814     1    91      0.513
##  8     3       2 A     0.125     8    93      0.159
##  9     4       2 A     0.461     7    33      1.10 
## 10     5       2 A     3.73      6    42      0.048
## 11     1       3 A     0.466     8    38      1.53 
## 12     2       3 A     1.19      2    75      0.513
## 13     3       3 A     2.21      6    54      0.159
## 14     4       3 A     0.476     1    15      1.10 
## 15     5       3 A     0.901     6    85      0.048
## 16     1       1 B     1.76      1    47      1.76 
## 17     2       1 B     0.791     7    43      0.791
## 18     3       1 B     0.053     3    18      0.053
## 19     4       1 B     0.152     3     8      0.152
## 20     5       1 B     0.763     7    48      0.763
## 21     1       2 B     0.919     1    24      1.76 
## 22     2       2 B     0.695     9    50      0.791
## 23     3       2 B     0.351     5    58      0.053
## 24     4       2 B     0.911     4    92      0.152
## 25     5       2 B     0.152     6    71      0.763
## 26     1       3 B     0.49      6    41      1.76 
## 27     2       3 B     0.63      7    72      0.791
## 28     3       3 B     0.529     6    82      0.053
## 29     4       3 B     1.02      8    64      0.152
## 30     5       3 B     0.862     4    31      0.763

Calculate % drift:

pct_diff <- function(reference, value) {
  x <- abs(reference - value)/max(reference,value)
  return(round(x,3))
}

result <- sample_data %>% 
            group_by(Group, SN) %>% 
            mutate(Val1_delta = pct_diff(first(Val1), Val1), 
                   Val2_delta = pct_diff(first(Val2), Val2), 
                   Val3_delta = pct_diff(first(Val3), Val3)) %>% 
            print(n = Inf, width = Inf)
## # A tibble: 30 x 9
## # Groups:   Group, SN [10]
##       SN TestNum Group  Val1  Val2  Val3 Val1_delta Val2_delta Val3_delta
##    <dbl>   <dbl> <chr> <dbl> <int> <int>      <dbl>      <dbl>      <dbl>
##  1     1       1 A     1.53      3    10      0          0          0    
##  2     2       1 A     0.513     9    30      0          0          0    
##  3     3       1 A     0.159     3     4      0          0          0    
##  4     4       1 A     1.10      4     9      0          0          0    
##  5     5       1 A     0.048     5    53      0          0          0    
##  6     1       2 A     0.567     1    26      0.629      0.25       0.421
##  7     2       2 A     0.814     1    91      0.252      0.889      0.67 
##  8     3       2 A     0.125     8    93      0.015      0.625      0.957
##  9     4       2 A     0.461     7    33      0.579      0.429      0.727
## 10     5       2 A     3.73      6    42      0.987      0.167      0.129
## 11     1       3 A     0.466     8    38      0.695      0.625      0.737
## 12     2       3 A     1.19      2    75      0.57       0.778      0.495
## 13     3       3 A     2.21      6    54      0.928      0.375      0.538
## 14     4       3 A     0.476     1    15      0.566      0.429      0.182
## 15     5       3 A     0.901     6    85      0.229      0.167      0.376
## 16     1       1 B     1.76      1    47      0          0          0    
## 17     2       1 B     0.791     7    43      0          0          0    
## 18     3       1 B     0.053     3    18      0          0          0    
## 19     4       1 B     0.152     3     8      0          0          0    
## 20     5       1 B     0.763     7    48      0          0          0    
## 21     1       2 B     0.919     1    24      0.479      0          0.489
## 22     2       2 B     0.695     9    50      0.121      0.222      0.097
## 23     3       2 B     0.351     5    58      0.563      0.333      0.488
## 24     4       2 B     0.911     4    92      0.741      0.125      0.913
## 25     5       2 B     0.152     6    71      0.709      0.143      0.324
## 26     1       3 B     0.49      6    41      0.722      0.833      0.128
## 27     2       3 B     0.63      7    72      0.204      0          0.403
## 28     3       3 B     0.529     6    82      0.9        0.5        0.78 
## 29     4       3 B     1.02      8    64      0.852      0.625      0.609
## 30     5       3 B     0.862     4    31      0.115      0.429      0.239

Filter relevant data and rearrange columns:

result %>%
  filter(TestNum > 1) %>%
  select(Group, SN, TestNum, Val1, Val1_delta, Val2, Val2_delta, Val3, Val3_delta) %>%
  print(n = Inf, width = Inf) 
## # A tibble: 20 x 9
## # Groups:   Group, SN [10]
##    Group    SN TestNum  Val1 Val1_delta  Val2 Val2_delta  Val3 Val3_delta
##    <chr> <dbl>   <dbl> <dbl>      <dbl> <int>      <dbl> <int>      <dbl>
##  1 A         1       2 0.567      0.629     1      0.25     26      0.421
##  2 A         2       2 0.814      0.252     1      0.889    91      0.67 
##  3 A         3       2 0.125      0.015     8      0.625    93      0.957
##  4 A         4       2 0.461      0.579     7      0.429    33      0.727
##  5 A         5       2 3.73       0.987     6      0.167    42      0.129
##  6 A         1       3 0.466      0.695     8      0.625    38      0.737
##  7 A         2       3 1.19       0.57      2      0.778    75      0.495
##  8 A         3       3 2.21       0.928     6      0.375    54      0.538
##  9 A         4       3 0.476      0.566     1      0.429    15      0.182
## 10 A         5       3 0.901      0.229     6      0.167    85      0.376
## 11 B         1       2 0.919      0.479     1      0        24      0.489
## 12 B         2       2 0.695      0.121     9      0.222    50      0.097
## 13 B         3       2 0.351      0.563     5      0.333    58      0.488
## 14 B         4       2 0.911      0.741     4      0.125    92      0.913
## 15 B         5       2 0.152      0.709     6      0.143    71      0.324
## 16 B         1       3 0.49       0.722     6      0.833    41      0.128
## 17 B         2       3 0.63       0.204     7      0        72      0.403
## 18 B         3       3 0.529      0.9       6      0.5      82      0.78 
## 19 B         4       3 1.02       0.852     8      0.625    64      0.609
## 20 B         5       3 0.862      0.115     4      0.429    31      0.239