R中矩阵的有效子集和列求和

R中矩阵的有效子集和列求和,r,R,如果这是一个愚蠢的问题,我很抱歉。我正在寻找优化我的代码,然而,我是一个新手在R,所以我不知道从哪里开始 我有一个矩阵X,它的行由y的元素标记。标签集是数字的,由{1,…,K}组成。我希望能够计算对应于不同标签的每个子矩阵的列和,并将其存储在M中。为了更清楚地说明这一点,我提供了我当前的代码: for (i in 1:K) { cluster = (y == i) if (any(cluster)) { clusterRows = X[cluster, , drop

如果这是一个愚蠢的问题,我很抱歉。我正在寻找优化我的代码,然而,我是一个新手在R,所以我不知道从哪里开始

我有一个矩阵X,它的行由y的元素标记。标签集是数字的,由{1,…,K}组成。我希望能够计算对应于不同标签的每个子矩阵的列和,并将其存储在M中。为了更清楚地说明这一点,我提供了我当前的代码:

for (i in 1:K) {
    cluster = (y == i)
    if (any(cluster)) {
      clusterRows = X[cluster, , drop = F]
      M[i, ] = colSums(clusterRows)
    }
}
有没有更好、更有效的方法?效率,我指的是运行时间

编辑:示例

输入:

set.seed(1)
X = matrix(rnorm(100*2), nrow = 100, ncol = 2)
y = rep(1:2, 50)
M = matrix(rep(0,4), 2)
K = 2
输出:

       [,1]      [,2]
[1,] 9.776280 -2.595435
[2,] 1.112457 -1.185373

编辑2:我没有使用除base之外的任何库。 这是我的会话信息:


我想你需要的是R基的rowsum函数。这个函数将获取矩阵的每一列,并根据一个组列或组向量折叠或求和这些列的每一行。这是一个非常快的函数,正如您在这里看到的:,这很可能是您想要的

以下是输入:

以下是函数:

结果如下:


我想你需要的是R基的rowsum函数。这个函数将获取矩阵的每一列,并根据一个组列或组向量折叠或求和这些列的每一行。这是一个非常快的函数,正如您在这里看到的:,这很可能是您想要的

以下是输入:

以下是函数:

结果如下:

我们可以使用R基骨料

我们可以使用R基骨料


请分享一些示例数据和预期输出。对于这样的情况,目标是提高运行时效率,共享样本数据的最佳方式是共享模拟/创建适当样本数据的代码。请使用set.seed,这样任何随机性都是可复制的!查看更多制作可复制示例的技巧。我已经添加了输入/输出+会话信息。您需要创建M矩阵才能工作。我做了适当的编辑。很抱歉,我忘了包括这些。请分享一些示例数据和预期输出。对于这样的情况,目标是提高运行时效率,共享样本数据的最佳方式是共享模拟/创建适当样本数据的代码。请使用set.seed,这样任何随机性都是可复制的!查看更多制作可复制示例的技巧。我已经添加了输入/输出+会话信息。您需要创建M矩阵才能工作。我做了适当的编辑。很抱歉,我忘了包括那个。
R version 3.4.4 (2018-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 19.3

Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] microbenchmark_1.4-7 compiler_3.4.4       tools_3.4.4  
set.seed(1)
X = matrix(rnorm(100*2), nrow = 100, ncol = 2)
y = rep(1:2, 50)
M = matrix(rep(0,4), 2)
K = 2
rowsum(X, y)
      [,1]      [,2]
1 9.776280 -2.595435
2 1.112457 -1.185373

aggregate(X ~ y, FUN = sum)