首页 > 解决方案 > 在 R 中计算数据并生成行

问题描述

我想使用以下函数计算带有列的行:row * EXP(columns)

这是数据:

df<-read.table(text=" Time
2.5
2.1
2.2
3.1
4
-2
-3
-1",h=T)



df2= c(0.2, -0.1,   1,  2)

例如,2.5*EXp(0.2);2.5*EXP (-0.1), 2.5 *EXP(1), 2.5*EXP(2) 2.1,2.2,.....-3.0 相同。

这给了我下表:

0.2 -0.1    1   2
3.053506895 9.603172812 893.9989236 18.47264025
2.564945792 6.686954761 301.3860014 15.51701781
2.687086068 7.320234183 395.5273835 16.25592342
3.78634855  16.52700973 4567.282501 22.90607391
4.885611033 37.31329406 52739.88682 29.5562244
-2.442805516    0.16370736  0.004354421 -14.7781122
-3.664208274    0.066237252 0.00028734  -22.1671683
-1.221402758    0.404607662 0.065988036 -7.389056099

我可以基于 Excel =(A3*EXP($D$2)) 来完成,但我很难使用 R 来完成它。任何帮助将不胜感激。

标签: rtidyverse

解决方案


你可以这样做:

t(sapply(df$Time, function(e){e*exp(df2)}))

          [,1]       [,2]      [,3]       [,4]
[1,]  3.053507  2.2620935  6.795705  18.472640
[2,]  2.564946  1.9001586  5.708392  15.517018
[3,]  2.687086  1.9906423  5.980220  16.255923
[4,]  3.786349  2.8049960  8.426674  22.906074
[5,]  4.885611  3.6193497 10.873127  29.556224
[6,] -2.442806 -1.8096748 -5.436564 -14.778112
[7,] -3.664208 -2.7145123 -8.154845 -22.167168
[8,] -1.221403 -0.9048374 -2.718282  -7.389056

或者:

Reduce(rbind,lapply(df$Time, function(e){e*exp(df2)}))

          [,1]       [,2]      [,3]       [,4]
init  3.053507  2.2620935  6.795705  18.472640
      2.564946  1.9001586  5.708392  15.517018
      2.687086  1.9906423  5.980220  16.255923
      3.786349  2.8049960  8.426674  22.906074
      4.885611  3.6193497 10.873127  29.556224
     -2.442806 -1.8096748 -5.436564 -14.778112
     -3.664208 -2.7145123 -8.154845 -22.167168
     -1.221403 -0.9048374 -2.718282  -7.389056

exp函数是矢量化的:

exp(df2)
[1] 1.2214028 0.9048374 2.7182818 7.3890561

所以这个想法是在你的指数前面循环因子向量,并连接输出。你可以用 for 循环和一个你也填充的空表来做旧式。这是我的建议:

lapply是一个输出列表的循环:

lapply(df$Time, function(e){e*exp(df2)})
[[1]]
[1]  3.053507  2.262094  6.795705 18.472640

[[2]]
[1]  2.564946  1.900159  5.708392 15.517018

[[3]]
[1]  2.687086  1.990642  5.980220 16.255923

[[4]]
[1]  3.786349  2.804996  8.426674 22.906074

[[5]]
[1]  4.885611  3.619350 10.873127 29.556224

[[6]]
[1]  -2.442806  -1.809675  -5.436564 -14.778112

[[7]]
[1]  -3.664208  -2.714512  -8.154845 -22.167168

[[8]]
[1] -1.2214028 -0.9048374 -2.7182818 -7.3890561

要连接,您希望将所有列表上的行绑定在一起(与rbind),这就是Reduce要做的:在列表上应用一个函数。

sapply是 lapply 的一个版本,它试图给出一个很好的输出,但它的含义是错误的,所以我不得不用t().


推荐阅读