我有一个逻辑矩阵,我需要使用apply将每列乘以此列的总和。 例如:
> a
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 0 0 0 0
[3,] 1 1 0 1
[4,] 1 0 0 1
> b <- colSums(a)
> b
[1] 3 2 1 3
我想得到以下矩阵:
> a
[,1] [,2] [,3] [,4]
[1,] 3 2 1 3
[2,] 0 0 0 0
[3,] 3 2 0 3
[4,] 3 0 0 3
我是这样做的,但是因为我需要将我的函数应用于一个庞大的数据集,我需要使用apply进行编码。谢谢。
答案 0 :(得分:3)
你可以取矩阵'a'的转置(t
),然后乘以向量('b'),取输出的转置(t
)得到想要的结果。
t(t(a)*b)
或者我们可以通过复制'b'的元素来使'a'和'b'的长度相同。通过执行b[col(a)]
,我们可以通过col
提供的索引复制'b'的每个元素。
a*b[col(a)]
为了更好地理解
col(a)
# [,1] [,2] [,3] [,4]
#[1,] 1 2 3 4
#[2,] 1 2 3 4
#[3,] 1 2 3 4
#[4,] 1 2 3 4
b[col(a)] #is a vector
#[1] 3 3 3 3 2 2 2 2 1 1 1 1 3 3 3 3
a*b[col(a)]
# [,1] [,2] [,3] [,4]
#[1,] 3 2 1 3
#[2,] 0 0 0 0
#[3,] 3 2 0 3
#[4,] 3 0 0 3
答案 1 :(得分:1)
除了@ akrun的回答,如果你真的想使用apply
:
apply(a,2,function(x)x*sum(x))
# [,1] [,2] [,3] [,4]
#[1,] 3 2 1 3
#[2,] 0 0 0 0
#[3,] 3 2 0 3
#[4,] 3 0 0 3
2
表示您处理列(即第二维)。因此,每个操作都在对应于列的向量上完成,因此使用sum
(适用于向量)而不是colSums
(适用于矩阵)。