HI,
You were close!
library('tidyverse')
set.seed(123)
x <- data.frame( compounds=c( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"),
sample1=sample( 1:6, replace=T, 10),
sample2=sample( 1:10, replace = T, 10),
sample3=sample( 1:10, replace = T, 10),
sample4=sample( 1:10, replace = T, 10),
sample5=sample( 1:10, replace = T, 10))
y <- data.frame( group1=sample( c(0,1), replace=T, 5),
group2=sample( c(0,1), replace=T, 5),
group3=sample( c(0,1), replace=T, 5))
rownames(y) <- c( "sample1", "sample2", "sample3", "sample4", "sample5")
#For every group ...
z = apply(y, 2, function(group){
#Make group True/False
group = as.logical(group)
#Check if no group is length 1 (can't do t-test)
if(sum(group) == 1 | sum(!group) == 1){
rep(NA, nrow(x))
} else {
#Do t test per compound per group
apply(x[,-1], 1, function(compound){
t.test(compound[group], compound[!group])$p.value
})
}
}) %>% as.data.frame() %>%
mutate(compound = x$compounds) %>%
select(compound, everything())
#Caluclate fdr for all groups
fdr = apply(z[,-1], 2, function(pval){
p.adjust(pval, method="fdr")
}) %>% as.data.frame()
#Update the column names
colnames(z)[-1] = paste(colnames(z)[-1], "pval", sep = "_")
colnames(fdr) = paste(colnames(fdr), "fdr", sep = "_")
#Merge and sort
z = cbind(z, fdr)
z = z %>% select(sort(colnames(z)))
z
#> compound group1_fdr group1_pval group2_fdr group2_pval group3_fdr
#> 1 a 0.899025 0.7657439 NA NA 0.3432181
#> 2 b 0.899025 0.8147895 NA NA 0.5521098
#> 3 c 0.899025 0.4609749 NA NA 0.5147975
#> 4 d 0.899025 0.8990250 NA NA 0.1249512
#> 5 e 0.899025 0.5413955 NA NA 0.5147975
#> 6 f 0.899025 0.3886101 NA NA 0.2886182
#> 7 g 0.899025 0.7160146 NA NA 0.5521098
#> 8 h 0.899025 0.1180829 NA NA 0.6992482
#> 9 i 0.899025 0.6374388 NA NA 0.3432181
#> 10 j 0.899025 0.4907869 NA NA 0.3432181
#> group3_pval
#> 1 0.11528406
#> 2 0.45791385
#> 3 0.35287187
#> 4 0.01249512
#> 5 0.36035825
#> 6 0.05772363
#> 7 0.49689883
#> 8 0.69924825
#> 9 0.14802788
#> 10 0.17160903
Created on 2022-03-10 by the reprex package (v2.0.1.9000)
PJ