I have two dataframes derived from my data.
One contains limits:
lim <- structure(list(cpx = c("A", "B", "C", "D"), par_1 = c(5, 10,
5, 1), par_2 = c(KET = 4.34, HNK = 8.68, NKT = 4.3, DHNK = 0.86
), par_3 = c(KET = 18.24, HNK = 36.21, NKT = 19.22, DHNK = 3.87
)), out.attrs = list(dim = c(4L, 2L), dimnames = list(Var1 = c("Var1=HNK",
"Var1=KET", "Var1=NKT", "Var1=DHNK"), Var2 = c("Var2=LLOQ", "Var2=ULOQ"
))), class = "data.frame", row.names = c(NA, -4L))
The second contains data from measurement:
data <- structure(list(smp_id = c("aa", "aa", "aa", "aa", "bb", "bb",
"bb", "bb", "cc", "cc", "cc", "cc", "dd", "dd", "dd", "dd", "ee",
"ee", "ee", "ee"), cpx = c("A", "B", "C", "D", "A", "B", "C",
"D", "A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"
), par_1 = c(4, 8, 4, 4, 4.5, 83, 6, 0.5, 5.5, 9, 4.5, 0.5, 20,
13, 18, 0.5, 100, 33, 53, 0.5), par_2 = c(4, 4, 4, 4, 4.5, 3,
3, 0.5, 5.5, 3, 3, 0.5, 20, 3, 3, 0.5, 100, 3, 3, 0.5), par_3 = c(4,
4, 4, 0.4, 4.5, 3, 3, 0.9, 5.5, 3, 3, 2, 20, 3, 3, 4, 100, 3,
3, 44)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-20L))
Number of parameter columns may vary depending on set.
Also number of cpx values per sample may vary depending on set (but is the same in one set).
I nedd to replace every value from data table that is lower than limit for cpx / parameter pair value from limit table with NA
I figured out how to do it for every cpx value separately.
limm_a <- limm %>%
filter(cpx == "A")
data_a <- data %>%
filter(cpx == "A") %>%
mutate(across(matches("par"),
~if_else(.x < limm_a[[cur_column()]], NA, .x)
))
I know I can close it in loop over each unique cpx from this set…
But it is not what I like to use.
I’ve tried some combinations like:
data <- data %>%
mutate(across(matches("par"),
~if_else(.x < limm[[cur_column()]][limm$cpx == data$cpx], NA, .x)
))
Tried to put row filtering in different way:
data <- data %>%
mutate(across(matches("par"),
~if_else(.x < filter(limm, cpx == .$cpx)[[cur_column()]], NA, .x)
))
But it all fails.
I’m quite new with R and still learning.
I want to do it in more elegant way than using for loop.
br Radek