通过对列进行分组将数据帧拆分为多个数据帧

Ken*_*enn 7 r bioinformatics dataframe dplyr

我有一个表达数据的数据框,其中基因是行,列是样本。我还有一个数据框,其中包含表达式数据框中每个样本的元数据。实际上,我的 expr 数据框有 30,000 多行和 100 多列。然而,下面是一个数据较小的示例。

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"))
Run Code Online (Sandbox Code Playgroud)

我想找到每次治疗中每个基因的平均值。从我看到的 split() 或 group_by() 示例中,人们根据 data.frame 中已存在的列进行分组。但是,我有一个单独的数据框(元),用于对另一个数据框(expr)中的列进行分组。

我希望我的输出是一个数据框,其中基因作为行,治疗作为列,值作为平均值。

#        control   treatment1   treatment2
#  gene1  mean        mean         mean
#  gene2  mean        mean         mean
Run Code Online (Sandbox Code Playgroud)

Fri*_*ede 6

基础 R 中的一种方法适用于给定的特定玩具数据示例:

colnames(expr) = paste0(colnames(expr), "_", 
                        meta$treatment[match(colnames(expr), meta$sample)])
vapply(unique(meta$treatment), 
       \(i) rowMeans(expr[grepl(i, colnames(expr))]), numeric(nrow(expr)))
#>       control treatment1 treatment2
#> gene1       3          1        3.0
#> gene2       2          2        2.5
#> gene3       3          1        3.0
#> gene4       2          0        3.5
#> gene5       0          1        4.0
Run Code Online (Sandbox Code Playgroud)

数据

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"))
Run Code Online (Sandbox Code Playgroud)


Gre*_*gor 2

像这样的东西。目前尚不完全清楚您想要在最后一步中按什么进行分组,但您可以轻松调整。

\n
library(dplyr)\nlibrary(tidyr)\n\nexpr |>\n  mutate(gene = row.names(expr)) |>\n  pivot_longer(-gene, names_to = "sample") |>\n  left_join(meta, by = "sample") |>\n  summarize(mean = mean(value), .by = c(gene, treatment)) |> \n  pivot_wider(names_from = treatment, values_from = mean)\n# # A tibble: 5 \xc3\x97 4\n#   gene  control treatment1 treatment2\n#   <chr>   <dbl>      <dbl>      <dbl>\n# 1 gene1       3          1        3  \n# 2 gene2       2          2        2.5\n# 3 gene3       3          1        3  \n# 4 gene4       2          0        3.5\n# 5 gene5       0          1        4  \n
Run Code Online (Sandbox Code Playgroud)\n