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