我想使用以下函数来计算带有列的行: 第*行(EXP(列)
以下是数据:
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来执行。任何帮助将不胜感激。
答案 0 :(得分:1)
您可以这样做:
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()
进行换位。
答案 1 :(得分:0)
您有几个EXP值?如果只有极少数,这是使用dplyr
的简单解决方案,那么我为前两列添加了一个示例:
library(dplyr)
df %>%
mutate("0.2" = Time*exp(0.2),"-0.1" = Time*exp(-0.1)) %>%
head()
在第一列的base r中有一个解决方案。
df["0.2"] <-df$Time*exp(0.2)
如果您的df2中有很多EXP值,则必须使用apply
系列中的函数,但是只有少数函数可以使用。
答案 2 :(得分:0)
您还应该查看outer()
。这正是您想要的解决方案:
outer(df$Time, 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
请注意,outer
的默认功能是乘法。那就是outer(X, Y, FUN = '*')
。您可以将功能更改为其他内容,例如outer(X, Y, FUN = '+')
或所需的任何功能。