使用指定的列数计算累计和

Sve*_*ven 2 r cumsum

下面你可以看到我有一个更大的桌子的例子

library(data.table)
input  <- data.table(ID     = c("A", "B"),
                     Para   = c(2.8, 5),
                     Value1 = c(50, 80),
                     Value2 = c(80, 40),
                     Value3 = c(80, 100),
                     Value4 = c(60, 10),
                     Value5 = c(40, 80))
Run Code Online (Sandbox Code Playgroud)

我想要实现的是添加一个列,其中包含Para列中指定的下一个x列的累积和.但如果逗号后面有数字,则应按数字调整列中的值.

所以对于第一行(Para = 2.8),结果应该是

1*50 + 1*80 + 0.8*80 = 194
Run Code Online (Sandbox Code Playgroud)

第二行(Para = 5)的结果应该是

1*80 + 1*40 + 1*100 + 1*10 + 1*80 = 310
Run Code Online (Sandbox Code Playgroud)

决赛桌应该是这样的

output <- cbind(input, Result = c(194, 310))
Run Code Online (Sandbox Code Playgroud)

我想到的是将Para值2.8分成5个数字的百分比向量,所以整个范围.

c(1, 1, .8, 0, 0)
Run Code Online (Sandbox Code Playgroud)

将Value1:Value5列与此向量相乘,然后将所有Value1:Value5相加.但是我不知道如何将2.8分成这样一个向量,也许还有一个我不了解的更好的解决方案.谢谢.

Uwe*_*Uwe 5

这是一种解决方案,它以宽格式保存数据并用于Reduce()计算"加权行总和":

library(data.table)
input[, Cumul := {
  tmp <- c(rep(1, Para), Para %% 1)
  mul <- replace(rep(0, ncol(.SD)), seq_along(tmp), tmp)
  Reduce(sum, .SD * mul)
}, .SDcols = Value1:Value5, by = ID]
input[]
Run Code Online (Sandbox Code Playgroud)
   ID Para Value1 Value2 Value3 Value4 Value5 Cumul
1:  A  2.8     50     80     80     60     40   194
2:  B  5.0     80     40    100     10     80   310
Run Code Online (Sandbox Code Playgroud)

这适用于指定的任意数量的列.SDcols或者如果Para更大.