首页 > 解决方案 > 通过外部向量的动态乘法动态汇总

问题描述

我有一个这样的小标题:

X = tibble(Name = rep(c("A","B","C"),5),
       Coeffs_1 = runif(15,0,1),
       Coeffs_2 = runif(15,0,1)) %>% arrange(Name)

Y = runif(10,0,100)

在此示例中,每个“名称”的“Reps”数量任意固定为 5,Coeffs_2 的数量任意固定为 2,但在我的代码中它们可以是任何数字,我不知道确切的数字。

我还有一个带有 n = reps*2 元素的向量:

Y = runif(10,0,100)

在这种特定情况下,它是 10 = 5*2。

我的任务是根据每个名称、每个 Coeff 总结这个公式:

Result_x[1] = sum(Coeff_x[1]*Y[2] + Coeff_x[2]* Y[3] + ... + Coeff_x[Reps]*Y[Reps+1]) - Y[1]
Result_x[2] = sum(Coeff_x[1]*Y[3] + Coeff_x[2]* Y[4] + ... + Coeff_x[Reps]*Y[Reps+2]) - Y[2]
.
.
.
Result_x[Reps] = sum(Coeff_x[1]* Y[Reps+1] + Coeff_x[2]* Y[Reps+2] + ... + Coeff_x[Reps]*Y[Reps*2]) - Y[Reps]

所以最后,最终的总结 tibble 应该如下所示:

姓名 落后 结果_1 ... 结果_x
一个 +1 一个号码 数字 一个号码
一个 +2 一个号码 数字 一个号码
一个 ... 一个号码 数字 一个号码
一个 代表 一个号码 数字 一个号码
+1 一个号码 数字 一个号码
+2 一个号码 数字 一个号码
... ... 一个号码 数字 一个号码
... 代表 一个号码 数字 一个号码

问题的动态性质使我很难用 for 循环很好地定义它,并且必须为原始 tibble 中的每一行重新索引和正确汇总的外部向量的存在使我难以使用管道.

我认为定义自定义函数可能会有所帮助,但它再次与管道代码混淆。

标签: r

解决方案


按“名称”拆分“X”,在list( map) 上循环,同时在指定为 a 的a中创建“Y”的shiftedlead值。循环遍历每个嵌套的'Coeff' 列,方法是获取列值的乘积,并校正相应的 'y' 长度并从'y' 的值中减去listnvectorlistsummarise acrosslistsumfirst

library(dplyr)
library(purrr)
library(data.table)
X %>% 
   group_split(Name) %>% 
   map_dfr(~ map_dfr(shift(Y, n = 1:nrow(.x), type = 'lead'), 
        function(y) .x %>% 
      summarise(Name = first(Name), across(starts_with('Coeff'),  
         ~ sum(. * y[seq_along(.)], na.rm = TRUE) - first(y)))) ) %>%
   mutate(Lag = rowid(Name))

-输出

# A tibble: 15 × 4
   Name  Coeffs_1 Coeffs_2   Lag
   <chr>    <dbl>    <dbl> <int>
 1 A        127.      54.4     1
 2 A        162.     134.      2
 3 A        127.      68.2     3
 4 A        109.      38.0     4
 5 A        108.      94.0     5
 6 B        175.     197.      1
 7 B        187.     240.      2
 8 B        151.     200.      3
 9 B        132.     159.      4
10 B        102.     152.      5
11 C         48.8    131.      1
12 C         89.1    128.      2
13 C         42.5     98.7     3
14 C         29.4     95.7     4
15 C         41.7     50.1     5

推荐阅读