使用R中需要多个参数的函数进行汇总

Var*_*ong 2 r dplyr

我正在尝试为一组模拟运行的每次运行获取一些数据曲线下的面积。我的数据具有以下形式:

run    year    data1    data2    data3
---    ----    -----    -----    -----
1      2001    2.3      45.6     30.2
1      2002    2.4      35.4     23.4
1      2003    2.6      45.6     23.6
2      2001    2.3      45.6     30.2
2      2002    2.4      35.4     23.4
2      2003    2.6      45.6     23.6
3      2001 ... and so on
Run Code Online (Sandbox Code Playgroud)

因此,我想获取运行1,运行2 ...的每个数据迹线的曲线下面积,其中x轴始终是年列,而y轴是每个数据列。因此,作为输出,我需要类似:

run    Data1_auc    Data2_auc    Data3_auc
---    ---------    ---------    ---------
1      4.5          6.7           27.5
2      3.4          6.8           35.4
3      4.5          7.8            45.6
Run Code Online (Sandbox Code Playgroud)

(这些不是上面数据的实际区域)

我想使用实用包'trapz'函数来计算需要x和y值的区域:trapz(x,y)其中x =年份(我的情况)和y = Data列。

我试过了

dataCols <- colnames(myData %>% select(-c("run","year"))
myData <- group_by(run) %>% summarize_at(vars(dataCols), list(auc = trapz(year,.)))
Run Code Online (Sandbox Code Playgroud)

但我无法使它正常工作。我对此尝试了不同的变体,但似乎无法正确解决。

这可能吗?如果是这样,我该怎么办?

Iar*_*min 5

library(dplyr)
library(pracma)

set.seed(1)
df <- tibble(
  run   = rep(1:3, each = 3),
  year  = rep(2001:2003, 3),
  data1 = runif(9, 2, 3),
  data2 = runif(9, 30, 50),
  data3 = runif(9, 20, 40)
)
df
#> # A tibble: 9 x 5
#>     run  year data1 data2 data3
#>   <int> <int> <dbl> <dbl> <dbl>
#> 1     1  2001  2.27  31.2  27.6
#> 2     1  2002  2.37  34.1  35.5
#> 3     1  2003  2.57  33.5  38.7
#> 4     2  2001  2.91  43.7  24.2
#> 5     2  2002  2.20  37.7  33.0
#> 6     2  2003  2.90  45.4  22.5
#> 7     3  2001  2.94  40.0  25.3
#> 8     3  2002  2.66  44.4  27.7
#> 9     3  2003  2.63  49.8  20.3

df %>% 
  group_by(run) %>% 
  summarise_at(vars(starts_with("data")), list(auc = ~trapz(year, .)))
#> # A tibble: 3 x 4
#>     run data1_auc data2_auc data3_auc
#>   <int>     <dbl>     <dbl>     <dbl>
#> 1     1      4.79      66.5      68.7
#> 2     2      5.10      82.3      56.4
#> 3     3      5.45      89.2      50.5
Run Code Online (Sandbox Code Playgroud)