R - 用向量列表划分矩阵列表的列

R - Dividing columns of matrix list by vector list

我有一个矩阵列表和一个向量列表,我想用对应的向量元素划分每个矩阵的列。

例如,给定

set.seed(230)
data <- list(cbind(c(NA, rnorm(6)),c(rnorm(6),NA)), cbind(runif(7), runif(7)))
divisors <- list(c(0.5,2), c(3,4))

我正在寻找一个矢量化函数,它产生的输出看起来与

相同
for(i in 1:length(data)){
  for(j in 1:ncol(data[[i]])){data[[i]][,j] <- data[[i]][,j] / divisors[[i]][j]}
}

[[1]]
            [,1]        [,2]
[1,]          NA  0.28265752
[2,] -0.46967014 -0.07132588
[3,]  0.20253439 -0.37432527
[4,]  0.65736410  0.06630705
[5,]  0.72349294  0.67202129
[6,]  0.88532648 -0.80892508
[7,]  0.08162027          NA

[[2]]
           [,1]       [,2]
[1,] 0.26597435 0.18120979
[2,] 0.31213250 0.16493883
[3,] 0.19250804 0.14104145
[4,] 0.21196882 0.10172964
[5,] 0.10389773 0.04979742
[6,] 0.02754329 0.15064043
[7,] 0.25771766 0.23042586

我最接近的是

Map(`/`, data, divisors)

但这会将矩阵的行(而不是列)除以向量。任何帮助表示赞赏。

在之前和之后转置您的矩阵:

lapply(Map(`/`, lapply(data, t), divisors), t)
# [[1]]
#             [,1]        [,2]
# [1,]          NA  0.28265752
# [2,] -0.46967014 -0.07132588
# [3,]  0.20253439 -0.37432527
# [4,]  0.65736410  0.06630705
# [5,]  0.72349294  0.67202129
# [6,]  0.88532648 -0.80892508
# [7,]  0.08162027          NA
# 
# [[2]]
#            [,1]       [,2]
# [1,] 0.26597435 0.18120979
# [2,] 0.31213250 0.16493883
# [3,] 0.19250804 0.14104145
# [4,] 0.21196882 0.10172964
# [5,] 0.10389773 0.04979742
# [6,] 0.02754329 0.15064043
# [7,] 0.25771766 0.23042586

我更喜欢上面的转置方法,但另一种选择是将除数向量扩展为与 data:

中维度相同的矩阵
div_mat = Map(matrix, data = divisors, nrow = sapply(data, nrow), ncol = 2, byrow = T)
Map("/", data, div_mat)