【问题标题】:Looping over a matrix into a matrix in R将矩阵循环到R中的矩阵
【发布时间】:2021-05-24 11:33:21
【问题描述】:

我想从数据帧/矩阵中计算不同行集的某些列均值,并将它们循环到一个新的矩阵/数据帧中。

我有一个看起来像这样的 df:

>mydf=as.data.frame(matrix(1:20, nrow = 10, ncol = 10))
>mydf=cbind(Sample_ID=c(rep("A",5), rep("B",5)), mydf)

>mydf
   Sample_ID V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1          A  1 11  1 11  1 11  1 11  1  11
2          A  2 12  2 12  2 12  2 12  2  12
3          A  3 13  3 13  3 13  3 13  3  13
4          A  4 14  4 14  4 14  4 14  4  14
5          A  5 15  5 15  5 15  5 15  5  15
6          B  6 16  6 16  6 16  6 16  6  16
7          B  7 17  7 17  7 17  7 17  7  17
8          B  8 18  8 18  8 18  8 18  8  18
9          B  9 19  9 19  9 19  9 19  9  19
10         B 10 20 10 20 10 20 10 20 10  20

现在我想要一个新的 2 x 10 数据框中的所有行 A [2:4,2:11] 和所有行 B [7:9,2:11] 的方法。这意味着,对于每组 sample_ID(col 1),我想要行 2:4 的所有 rowmeans。

  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 3 13  3 13  3 13  3 13  3  13
2 8 18  8 18  8 18  8 18  8  18

我的代码如下所示:

 Means_genes <- matrix(nrow = length(unique(mydf$Sample_ID)), ncol = (length(mydf[1,])-1))
 for(i in mydf[!duplicated(mydf$Sample_ID), ]$Sample_ID){
 sample = mydf[mydf$Sample_ID == i, ]
  samplemean=colMeans(sample[2:4,2:length(sample[1,])])
   for (j in 1: length(unique(mydf$Sample_ID))){
    Means_genes[j,]=c(samplemean)}
 }

这给了我正确的矩阵大小,但它只填充了最后一个循环的列手段。 任何帮助将不胜感激!

【问题讨论】:

    标签: r dataframe loops for-loop matrix


    【解决方案1】:

    您可以使用by 拆分每个Sample_ID 的数据,并计算每组中第2-4 行的列平均值。

    result<- do.call(rbind, by(mydf[-1],mydf$Sample_ID,function(x) colMeans(x[2:4,])))
    
    #  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    #A  3 13  3 13  3 13  3 13  3  13
    #B  8 18  8 18  8 18  8 18  8  18
    

    或者dplyr

    library(dplyr)
    
    result <- mydf %>%
      group_by(Sample_ID) %>%
      slice(2:4) %>%
      summarise(across(V1:V10, mean)) %>%
      select(-Sample_ID)
    

    【讨论】:

    • 没错,谢谢!但是我的工作矩阵有几 1000 行和几行,所以即使是我的小最终矩阵也有超过 100 行。因此,我想以某种方式循环它。对于每组 sample_ID(col 1),我想要行 2:4 的所有 rowmeans。
    • @Enom 我明白了。我现在明白了。请参阅我的更新答案。
    最近更新 更多