Eu tenho um dataframe de dados de expressão onde os genes são linhas e as colunas são amostras. Também tenho um dataframe contendo metadados para cada amostra no dataframe da expressão. Na realidade, meu dataframe expr tem mais de 30.000 linhas e mais de 100 colunas. No entanto, abaixo está um exemplo com dados menores.
expr <- data.frame(sample1 = c(1,2,2,0,0),
sample2 = c(5,2,4,4,0),
sample3 = c(1,2,1,0,1),
sample4 = c(6,5,6,6,7),
sample5 = c(0,0,0,1,1))
rownames(expr) <- paste0("gene",1:5)
meta <- data.frame(sample = paste0("sample",1:5),
treatment = c("control","control",
"treatment1",
"treatment2", "treatment2"))
Quero encontrar a média de cada gene por tratamento. Dos exemplos que vi com split() ou group_by() agrupar pessoas com base em uma coluna já presente no data.frame. No entanto, tenho um dataframe separado (meta) que classifica o agrupamento das colunas em outro dataframe (expr).
Gostaria que minha saída fosse um dataframe com genes como linhas, tratamento como colunas e valores como média.
# control treatment1 treatment2
# gene1 mean mean mean
# gene2 mean mean mean
Uma abordagem na base R que funciona para o exemplo específico de dados de brinquedos fornecido:
Dados
Algo assim. Não está totalmente claro o que você deseja agrupar na última etapa, mas você pode ajustar isso facilmente.
Uma abordagem base R:
Aqui está uma
data.table
abordagem com a mesma lógica fornecida por @Gregor Thomas:Aqui está outra abordagem
tidyverse
, substituindo números de amostra por tratamentos,meta
criando um vetor nomeado em vez deleft_join()
e também usandovalues_fn
insidepivot_wider()
em vez desummarise()
:Criado em 21/12/2023 com reprex v2.0.2