我想用矩阵和向量计算指数。矩阵如下
ID var_0 var_01 var_02 var_03
1 1 2 3 4
2 5 6 7 8
3 9 10 11 12
...
和向量是(0.1,0.2,0.3,0.4)
我想得到如下结果
ID var_0 var_01 var_02 var_03
1 1^0.1 2^0.2 3^0.3 4^0.4
2 5^0.1 6^0.2 7^0.3 8^0.4
3 9^0.1 10^0.2 11^0.3 12^0.4
...
也就是说,我想为每个ID获取(ith var)^ ith矢量
答案 0 :(得分:5)
您可以使用R的矢量回收。转置矩阵,以便以正确的顺序应用功率计算,然后转置回来。
(m <- matrix(1:12, nrow=3, ncol=4, byrow=TRUE))
# [,1] [,2] [,3] [,4]
# [1,] 1 2 3 4
# [2,] 5 6 7 8
# [3,] 9 10 11 12
p <- 1:4
t(t(m)^p)
# [,1] [,2] [,3] [,4]
# [1,] 1 4 27 256
# [2,] 5 36 343 4096
# [3,] 9 100 1331 20736
答案 1 :(得分:2)
您可以使用sweep
功能执行此操作。签名是
sweep(x, MARGIN, STATS, FUN)
此函数根据您设置x
的方式迭代部分MARGIN
。在每次迭代中,x
的当前部分和整个参数STATS
将传递给FUN
,这应该是一个带有2个参数的函数。
将MARGIN
设置为1意味着STATS
与x
(维度1)的行对齐,2表示STATS
与x
的列对齐}(维度2)。其他变化也是可能的。
因此,对于您的特定示例,请使用
sweep(your.matrix, 2, your.exponents, `^`)
编辑:根据@ david-arenburg的回答,您可能不应该使用sweep
。我不知道它太慢了!
答案 2 :(得分:2)
或者你可以做(来自@ user20650的帖子的数据)
m^p[col(m)]
# [,1] [,2] [,3] [,4]
#[1,] 1 4 27 256
#[2,] 5 36 343 4096
#[3,] 9 100 1331 20736
答案 3 :(得分:2)
或者(使用@ user20650的数据集)
m^rep(p, each = nrow(m))
# [,1] [,2] [,3] [,4]
# [1,] 1 4 27 256
# [2,] 5 36 343 4096
# [3,] 9 100 1331 20736
另一个选择
m ^ matrix(p, nrow(m), ncol(m), byrow = TRUE)
# [,1] [,2] [,3] [,4]
# [1,] 1 4 27 256
# [2,] 5 36 343 4096
# [3,] 9 100 1331 20736
更大数据集的一些基准测试。好像我的两个答案和@akruns衡量最好的
n <- 1e6
cols <- 100
m <- matrix(seq_len(n), nrow = n, ncol = cols)
p <- seq_len(cols)
user20650 = function() {t(t(m)^p)}
Nick = function() {sweep(m, 2, p, `^`)}
akrun = function() {m^p[col(m)]}
David1 = function() {m^rep(p, each = nrow(m))}
David2 = function() {m ^ matrix(p, nrow(m), ncol(m), byrow = TRUE)}
library(microbenchmark)
Res <- microbenchmark(
user20650() ,
Nick(),
akrun(),
David1(),
David2()
)
Res
# Unit: seconds
# expr min lq median uq max neval
# user20650() 9.692392 9.800470 9.878385 10.010198 11.002012 100
# Nick() 10.487660 10.595750 10.687573 10.896852 14.083319 100
# akrun() 8.213784 8.316646 8.395962 8.529671 9.325273 100
# David1() 9.115449 9.219430 9.304380 9.425614 10.445129 100
# David2() 8.157632 8.275277 8.335884 8.437017 9.348252 100
boxplot(Res)