R 对来自数据帧的数据进行分组以进行数据分析

R Grouping data from dataframes for data analysis

我需要帮助,因为我不知道如何处理。我有 2 个数据框,它们看起来像这样:

(df1) DataGenSample: 每列是一个样本,第一列是基因

(df2) 子类型:2 列的 df,第 1 列是样本,第 2 列是癌症的亚型

我要查找的第一件事是 select 仅从子类型中匹配 DataGenSample 样本,然后将它们与其子类型分开。

可以找到数据文件here

非常欢迎任何帮助!因为我迷路了。

DataGenSample <- read.table("DataGenSample.txt",sep="\t", header=TRUE, check.names = FALSE)
Subtypes <- read.table("SamplesType.txt",sep="\t", header=TRUE, check.names = FALSE)

一个小例子: df1:

hugo_symbol   TCGA-3C-AAAU-01    TCGA-3C-AALI-01    TCGA-3C-AALJ-01 ... TCGA-3C-AALL-99
CDK11A               0                 -1                -1         ...     -1
HNRNPR               0                 -1                -1         ...     -1
SRSF10               0                 -1                -1         ...     -1

df2:

Sample_id            Subtype
TCGA-3C-AAAU-01        BRCA_LumA
TCGA-3C-AALI-01        BRCA_Her2
TCGA-3C-AALL-99        BRCA_Normal

预期输出:

-BRCA_LumA.df:

hugo_symbol   TCGA-3C-AAAU-01    
CDK11A               0              
HNRNPR               0              
SRSF10               0                

-BRCA_Her2.df:

hugo_symbol   TCGA-3C-AALI-01   
CDK11A               -1              
HNRNPR               -1              
SRSF10               -1   

-BRCA_Normal.df:

hugo_symbol   TCGA-3C-AALL-99   
CDK11A               -1              
HNRNPR               -1              
SRSF10               -1   

如果我们需要基于 'Subtype' 创建一个 list of data.frame,我们可以通过 [= 创建一个 split of 'Sample_id' 21=] 到 vectorlist 中,使用该名称来 select 第一个数据集的列以及 'hugo_symbol'

lst1 <-  lapply(split(df2$Sample_id, df2$Subtype), 
         function(nm) df1[c("hugo_symbol", nm)])
lst1
#$BRCA_Her2
#  hugo_symbol TCGA-3C-AALI-01
#1      CDK11A              -1
#2      HNRNPR              -1
#3      SRSF10              -1

#$BRCA_LumA
#  hugo_symbol TCGA-3C-AAAU-01
#1      CDK11A               0
#2      HNRNPR               0
#3      SRSF10               0

#$BRCA_Normal
#  hugo_symbol TCGA-3C-AALL-99
#1      CDK11A              -1
#2      HNRNPR              -1
#3      SRSF10              -1

数据

df1 <- structure(list(hugo_symbol = c("CDK11A", "HNRNPR", "SRSF10"), 
    `TCGA-3C-AAAU-01` = c(0L, 0L, 0L), `TCGA-3C-AALI-01` = c(-1L, 
    -1L, -1L), `TCGA-3C-AALJ-01` = c(-1L, -1L, -1L), `TCGA-3C-AALL-99` = c(-1L, 
    -1L, -1L)), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(Sample_id = c("TCGA-3C-AAAU-01", "TCGA-3C-AALI-01", 
"TCGA-3C-AALL-99"), Subtype = c("BRCA_LumA", "BRCA_Her2", "BRCA_Normal"
)), class = "data.frame", row.names = c(NA, -3L))

如果我理解正确,您希望 select DataGenSample 中的列子集对应于子类型中的某个子类型。这可以通过使用 tidyr 包中的 pivot_longer() 将列旋转到行来实现(名称在旧版本中为 gather())。在枢轴之后,您可以在 SAMPLE_ID 上连接两个数据框。

您现在可以过滤子类型,SAMPLE_IDs(现在数量减少)可以旋转回列。 您可以使用 for 循环分别对所有子类型执行此操作,根据过滤器中的子类型使用 assign() 命名数据框。

library(dplyr)
library(tidyr)

DataGenSample_long <- DataGenSample %>% 
  pivot_longer(names_to = 'SAMPLE_ID', values_to = 'value', cols = -Hugo_Symbol) 

DataGenSample_long_join <- DataGenSample_long %>% 
  left_join(Subtypes, by = 'SAMPLE_ID')

for (Subtype in unique(Subtypes$SUBTYPE)) {
  assign(paste0(Subtype,'.df'), 
         DataGenSample_long_join %>% 
           filter(SUBTYPE == Subtype) %>% 
           select(-SUBTYPE) %>% 
           pivot_wider(names_from = SAMPLE_ID, values_from = value))
}