You can join the two dataframes using the Subject variable as a common key. That will let you apply a filter to each row, keeping only experiments where the RT is between the upper and lower bounds for each subject.
Edited to add some toy data to better demonstrate join and filter
The data frame that results from left_join will have the upper and lower bounds for your RT added as extra columns, matched up by Subject ID. You should inspect the output prior to filtering to make sure its working as you expect.
The filter operates on each row, checking whatever is in that row's RT column against the upper and lower bounds brought in by joining the tables.
library(dplyr)
df2 <- tibble::tibble(Subject = c(1,2,3,4),
Mean_RT = c(485,485,485,485),
SD_RT = c(102,102,102,102),
RTUpper = c(688,650,640,700),
RTLower = c(281,280,250,300))
df1 <- structure(list(Experiment = c("Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE", "Bayesmicro-53-SINGLE",
"Bayesmicro-53-SINGLE"), Subject = c(1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4), Block = c(2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2), practice_experimental = c("experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental", "experimental",
"experimental", "experimental", "experimental"), Trial = c(1,
2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 18, 1, 2, 3, 4, 5,
6, 7, 8, 9, 11, 13, 14, 15, 16, 18, 1, 2, 3, 4, 5, 6, 7, 8, 9,
11, 13, 14, 15, 16, 18), Congruency = c("Congruent", "Incongruent",
"Congruent", "Congruent", "Congruent", "Incongruent", "Incongruent",
"Incongruent", "Incongruent", "Congruent", "Incongruent", "Incongruent",
"Incongruent", "Congruent", "Incongruent", "Congruent", "Incongruent",
"Congruent", "Congruent", "Congruent", "Incongruent", "Incongruent",
"Incongruent", "Incongruent", "Congruent", "Incongruent", "Incongruent",
"Incongruent", "Congruent", "Incongruent", "Congruent", "Incongruent",
"Congruent", "Congruent", "Congruent", "Incongruent", "Incongruent",
"Incongruent", "Incongruent", "Congruent", "Incongruent", "Incongruent",
"Incongruent", "Congruent", "Incongruent"), Acc = c(1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
), RT = c(549, 510, 106, 568, 401, 458, 494, 876, 567, 444, 507,
658, 613, 150, 513, 549, 510, 476, 900, 401, 458, 494, 876, 567,
444, 507, 658, 778, 129, 13, 549, 510, 476, 568, 401, 458, 494,
876, 567, 444, 507, 658, 613, 529, 513)), row.names = c(NA, -45L
), spec = structure(list(cols = list(Experiment = structure(list(), class = c("collector_character",
"collector")), Subject = structure(list(), class = c("collector_double",
"collector")), Block = structure(list(), class = c("collector_double",
"collector")), practice_experimental = structure(list(), class = c("collector_character",
"collector")), Trial = structure(list(), class = c("collector_double",
"collector")), Congruency = structure(list(), class = c("collector_character",
"collector")), Acc = structure(list(), class = c("collector_double",
"collector")), RT = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), delim = ","), class = "col_spec"), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
df1
#> # A tibble: 45 × 8
#> Experiment Subject Block practice_experimental Trial Congruency Acc RT
#> <chr> <dbl> <dbl> <chr> <dbl> <chr> <dbl> <dbl>
#> 1 Bayesmicro-… 1 2 experimental 1 Congruent 1 549
#> 2 Bayesmicro-… 1 2 experimental 2 Incongrue… 1 510
#> 3 Bayesmicro-… 1 2 experimental 3 Congruent 1 106
#> 4 Bayesmicro-… 1 2 experimental 4 Congruent 1 568
#> 5 Bayesmicro-… 1 2 experimental 5 Congruent 1 401
#> 6 Bayesmicro-… 1 2 experimental 6 Incongrue… 1 458
#> 7 Bayesmicro-… 1 2 experimental 7 Incongrue… 1 494
#> 8 Bayesmicro-… 1 2 experimental 8 Incongrue… 1 876
#> 9 Bayesmicro-… 1 2 experimental 9 Incongrue… 1 567
#> 10 Bayesmicro-… 2 2 experimental 11 Congruent 1 444
#> # ℹ 35 more rows
df1 %>%
left_join(df2, by = 'Subject') %>%
filter(RTLower < RT & RT < RTUpper)
#> # A tibble: 34 × 12
#> Experiment Subject Block practice_experimental Trial Congruency Acc RT
#> <chr> <dbl> <dbl> <chr> <dbl> <chr> <dbl> <dbl>
#> 1 Bayesmicro-… 1 2 experimental 1 Congruent 1 549
#> 2 Bayesmicro-… 1 2 experimental 2 Incongrue… 1 510
#> 3 Bayesmicro-… 1 2 experimental 4 Congruent 1 568
#> 4 Bayesmicro-… 1 2 experimental 5 Congruent 1 401
#> 5 Bayesmicro-… 1 2 experimental 6 Incongrue… 1 458
#> 6 Bayesmicro-… 1 2 experimental 7 Incongrue… 1 494
#> 7 Bayesmicro-… 1 2 experimental 9 Incongrue… 1 567
#> 8 Bayesmicro-… 2 2 experimental 11 Congruent 1 444
#> 9 Bayesmicro-… 2 2 experimental 13 Incongrue… 1 507
#> 10 Bayesmicro-… 2 2 experimental 15 Incongrue… 1 613
#> # ℹ 24 more rows
#> # ℹ 4 more variables: Mean_RT <dbl>, SD_RT <dbl>, RTUpper <dbl>, RTLower <dbl>
Created on 2023-05-01 with reprex v2.0.2