R从数据帧中对数据进行分组以进行数据分析

问题描述 投票:0回答:2

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

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

enter image description here

[(df2)子类型:2列的df,第一个col是样品,第二个col是癌症的亚型

enter image description here

我正在寻找的第一件事是从子类型中仅选择匹配的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   
r dataframe select genetic-programming
2个回答
2
投票

如果我理解正确,您想从DataGenSample中选择与子类型中某个子类型相对应的列子集。这可以通过使用tidyr软件包中的pivot_longer()将列旋转为行来实现(旧版本中的名称为gather())。进行数据透视之后,您可以将两个数据帧合并到SAMPLE_ID上。

您现在可以按子类型进行过滤,并且SAMPLE_ID(现在数量已减少)可以转回到列中。您可以使用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))
}

1
投票

如果我们需要基于'Subtype'创建listdata.frame,则可以将'​​Subtype'的'Sample_id'的split创建为list s的vector,请使用该名称以选择第一个数据集的列以及'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))
© www.soinside.com 2019 - 2024. All rights reserved.