这个问题类似于我问previously的问题,但我在这里定义的组略有不同。
我试图将向量内的某些元素与矩阵相乘,同时将向量中的所有其他元素设置为零,然后为下一个组重复该过程。我想要使用的元素是n个元素。
我的数据集非常大,所以为了便于说明,请:
a <- c(2:7)
b <- matrix(1:36, byrow = TRUE, nrow = 6)
description <- c("AA1", "AA2", "AA3", "BB1", "BB2", "BB3")
names(a) <- description
,并提供:
a
AA1 AA2 AA3 BB1 BB2 BB3
2 3 4 5 6 7
b
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 6
[2,] 7 8 9 10 11 12
[3,] 13 14 15 16 17 18
[4,] 19 20 21 22 23 24
[5,] 25 26 27 28 29 30
[6,] 31 32 33 34 35 36
将a定义为具有三个组:
所以在这个例子中,我希望匹配向量中具有相同数字的每个元素,然后将其与矩阵相乘。因此,对于组1,向量将是(2, 0, 0, 5, 0, 0)
组2 (0, 3, 0, 0, 6, 0)
和组3 (0, 0, 4, 0, 0, 7)
组1的向量矩阵乘法(a %*% b
)将给出结果:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 97 104 111 118 125 132
所以我想要使用grepl
代码匹配向量中的数字,或者以某种方式告诉r将组之间的两个元素设置为零,然后为下一个组重复该过程。 / p>
最好的代码是什么?
答案 0 :(得分:1)
g
是分组向量c(1, 2, 3, 1, 2, 3)
,使得对应于分组向量的相同值的所有元素属于同一组。
现在outer(...)
给出了一个三列矩阵Ind
,其每列都是一个组的指示变量。对于Ind
的每一列,在sapply
:
g <- as.numeric(gsub("\\D", "", names(a)))
Ind <- outer(g, unique(g), `==`)
sapply(1:ncol(Ind), function(i) a %*% (b * Ind[, i]))
,并提供:
[,1] [,2] [,3]
[1,] 97 171 269
[2,] 104 180 280
[3,] 111 189 291
[4,] 118 198 302
[5,] 125 207 313
[6,] 132 216 324
最后一行代码可以写成:
sapply(split(Ind, col(Ind)), function(ind) a[ind] %*% b[ind, ])
或
sapply(1:ncol(Ind), function(i) a %*% diag(Ind[, i]) %*% b)
更新:根据问题的澄清进行了修订。