Если все гены одинаковы в каждом соответствующем фрейме данных, то ave
не требуется, так как не существует нескольких групп. Следовательно, вы можете запустить простой расчет: m$Zscore <- scale(m$expr)
. Оттуда, как @ emilliman5 комментарии, нарисуйте все три вектора со списком и даже назовите ось X с именованным списком:
# WITH SEABORN COLORS
boxplot(list(missense=m$Zscore, nonsense=n$Zscore, synonymous=s$Zscore),
col = c("#4c72b0","#55a868","#c44e52"))
Даже рассмотрите возможность привязки строки ко всем фреймам данных, но добавьте новый столбец для индикатора variable_type . Затем используйте ave
, так как теперь гены будут различаться в пределах фрейма данных. И даже используйте стиль формулы вместо list()
для boxplot
:
all_gene_df <- rbind(transform(m, variant_type='missense'),
transform(n, variant_type='nonsense'),
transform(s, variant_type='synonymous'))
all_gene_df$Zscore <- with(all_gene_df, ave(expr, variant_type, FUN = scale))
# WITH SEABORN COLORS
boxplot(Zscore ~ variant_type, data = all_gene_df,
col = c("#4c72b0","#55a868","#c44e52"),
main = "ZScore Boxplots by Gene",
xlab = "Genes",
ylab = "ZScore")
![Box Plot Output](https://i.stack.imgur.com/xWWdd.png)
Данные
set.seed(103018)
m <- data.frame(SampleID = paste0(sample(LETTERS, 50, replace=TRUE), sample(LETTERS, 50, replace=TRUE),
sample(LETTERS, 50, replace=TRUE), sample(100:999, 50, replace=TRUE)),
expr = runif(50)*10,
gene = 'MISSENSE0001')
n <- data.frame(SampleID = paste0(sample(LETTERS, 50, replace=TRUE), sample(LETTERS, 50, replace=TRUE),
sample(LETTERS, 50, replace=TRUE), sample(100:999, 50, replace=TRUE)),
expr = runif(50)*10,
gene = 'NONSENSE0001')
s <- data.frame(SampleID = paste0(sample(LETTERS, 50, replace=TRUE), sample(LETTERS, 50, replace=TRUE),
sample(LETTERS, 50, replace=TRUE), sample(100:999, 50, replace=TRUE)),
expr = runif(50)*10,
gene = 'SYNONYMOUS0001')