为数据帧列表应用和聚合列R

时间:2019-06-18 19:01:58

标签: r aggregate lapply

新手,在此先感谢您的帮助

我有一个包含多个数据框(AllExplants)的列表,它们具有相同数量的列(具有相同的名称)和不同数量的行。我希望一次汇总列表中所有数据框的列。

我的数据:为简单起见,我将在此处使用两个数据框的列表

AllExplants <- list(Explant1, Explant2)

Explant1:

 `Sample Name`                       `Tissue Category` `Annotation ID`                              All Negative `Non-nuclear`   PD1  PDL1
1 LT181- PD1 PDL1 MNF -1_Scan1.qptiff All               LT181- PD1 PDL1 MNF -1_Scan1_[10311,49192] 25140     4954            23  4418 15635
2 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Stroma            LT181- PD1 PDL1 MNF -1_Scan1_[10311,49192]  8788     1678            23  2922  4114
3 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Tumour            LT181- PD1 PDL1 MNF -1_Scan1_[10311,49192] 16344     3268             0  1496 11521
4 LT181- PD1 PDL1 MNF -1_Scan1.qptiff All               LT181- PD1 PDL1 MNF -1_Scan1_[10311,51272] 37930     9847           137  9821 17921
5 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Stroma            LT181- PD1 PDL1 MNF -1_Scan1_[10311,51272] 17400     5700           123  4914  6544
6 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Tumour            LT181- PD1 PDL1 MNF -1_Scan1_[10311,51272] 20526     4144            13  4907 11377
7 LT181- PD1 PDL1 MNF -1_Scan1.qptiff All               LT181- PD1 PDL1 MNF -1_Scan1_[12161,50230]  2315     1105            34   334   818
8 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Stroma            LT181- PD1 PDL1 MNF -1_Scan1_[12161,50230]  1666      934            30   266   427
9 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Tumour            LT181- PD1 PDL1 MNF -1_Scan1_[12161,50230]   639      164             1    68   391    

Explant2:

  `Sample Name`                       `Tissue Category` `Annotation ID`                              All Negative `Non-nuclear`   PD1  PDL1
1 LT181- PD1 PDL1 MNF -1_Scan1.qptiff All               LT181- PD1 PDL1 MNF -1_Scan1_[10872,46112] 19602     4370            47  3176 11983
2 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Stroma            LT181- PD1 PDL1 MNF -1_Scan1_[10872,46112]  8479     2158            36  2624  3644
3 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Tumour            LT181- PD1 PDL1 MNF -1_Scan1_[10872,46112] 11116     2207            11   552  8339
4 LT181- PD1 PDL1 MNF -1_Scan1.qptiff All               LT181- PD1 PDL1 MNF -1_Scan1_[11335,47845] 14783     2036            10  1697 10973
5 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Stroma            LT181- PD1 PDL1 MNF -1_Scan1_[11335,47845]  3179      494             6   894  1770
6 LT181- PD1 PDL1 MNF -1_Scan1.qptiff Tumour            LT181- PD1 PDL1 MNF -1_Scan1_[11335,47845] 11604     1542             4   803  9203

我希望汇总第4-8列(即全部,阴性,无核,PD1,PDL1),并根据第2列(组织类别)进行汇总

我可以使用下面的代码对每个单独的数据框(如果不在列表中)执行此操作

Explant1_agg <- aggregate(Explant1 [,4:8], by=list(Explant1$`Tissue Category`), FUN=sum)

但是,要将相同的功能应用于列表中的所有数据框很费时,我尝试了此代码,并查看了以下文章:

AllExplants_agg <- lapply(AllExplants, function(x) {aggregate(x[,4:8], by=list(x[,2]),  FUN=sum)})

但是R返回错误

 Error in aggregate.data.frame(x[, 4:8], by = list(x[, 2]), FUN = sum) : 
  arguments must have same length 

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我知道这个问题已经很老了,但是我遇到了同样的问题并将其修复,因此我认为它可能仍然很有趣。
我没有设法让R来汇总使用列表,但是我通过for循环解决了这个问题:

dat=seq(from=1, by=1, to=length(All_Explants))
#list to ID dataframes
output_All_Explants=list() #create list for output data from for loop
for (i in dat) { 
    dummy=as.data.frame(All_Explants[[i]])
    Output_All_Explants[[i]]=aggregate(dummy[,4:8], 
    by=list(date=dummy$Tissue Category), FUN=sum) 
}