计算数据并在R中生成行

时间:2019-08-02 21:01:10

标签: r tidyverse

我想使用以下函数来计算带有列的行: 第*行(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来执行。任何帮助将不胜感激。

3 个答案:

答案 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 = '+')或所需的任何功能。