作者:广东工业大学普通话_333 | 来源:互联网 | 2022-12-07 15:41
下面你可以看到我有一个更大的桌子的例子
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))
我想要实现的是添加一个列,其中包含Para列中指定的下一个x列的累积和.但如果逗号后面有数字,则应按数字调整列中的值.
所以对于第一行(Para = 2.8),结果应该是
1*50 + 1*80 + 0.8*80 = 194
第二行(Para = 5)的结果应该是
1*80 + 1*40 + 1*100 + 1*10 + 1*80 = 310
决赛桌应该是这样的
output <- cbind(input, Result = c(194, 310))
我想到的是将Para值2.8分成5个数字的百分比向量,所以整个范围.
c(1, 1, .8, 0, 0)
将Value1:Value5列与此向量相乘,然后将所有Value1:Value5相加.但是我不知道如何将2.8分成这样一个向量,也许还有一个我不了解的更好的解决方案.谢谢.
1> Uwe..:
这是一种解决方案,它以宽格式保存数据并用于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[]
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
这适用于指定的任意数量的列.SDcols
或者如果Para
更大.