由于我在以下問題中找不到答案:

uj5u.com熱心網友回復:
這種使用能解決問題Reduce嗎?
tmp = data.table(
grp = c(rep(0,6), rep(1,6)),
x=c(10,20,30,40,50,60,1,2,3,4,5,6),
y=c(1,2,3,4,5,6, 10,20,30,40,50,60)
)
tmp[, z:=Reduce(f=function(z,i) z x[i-1] - y[i-1],
x=(1:.N)[-1],
init=0,
accumulate = T)
,by=grp
]
輸出:
grp x y z
1: 0 10 1 0
2: 0 20 2 9
3: 0 30 3 27
4: 0 40 4 54
5: 0 50 5 90
6: 0 60 6 135
7: 1 1 10 0
8: 1 2 20 -9
9: 1 3 30 -27
10: 1 4 40 -54
11: 1 5 50 -90
12: 1 6 60 -135
以第 4 行為例。z 列的值為 54,等于前一行的 z 值 前一行的 x 值,減去前一行的 y 值。
Reduce 中的函式f可以采用任何復雜的形式,包括ifelse陳述句。這是一個示例,我在其中創建了一個名為 的函式func,它是Reduce. 請注意,在 Reduce 陳述句中,f是一個函式prev(感謝@r2evans 的建議),該函式首先計算前一行的s值減去前一行的t值(這類似于您的x[-1]-y[-1]. 然后有一個ifelse陳述句。如果先前的行s和t值(即k)> 20,則該行中的新值將是先前z值減去20-4k(即prev-(20-4k))的乘積,否則它將是先前z值 k(即等于您的原始配方z[i-1] x[i-1]-y[i-1]:)
func <- function(s,t) {
Reduce(
f=function(prev,i) {
k=s[i-1] - t[i-1]
ifelse(k>10, prev -(20-4*k), prev k)
},
x=2:length(s),
init=0,
accumulate = TRUE
)
}
然后,您可以將值分配func(x,y)給 z,如下所示:
tmp[, z:=func(x,y), by=.(grp)][]
輸出:
grp x y z
1: 0 10 1 0
2: 0 20 2 9
3: 0 30 3 61
4: 0 40 4 149
5: 0 50 5 273
6: 0 60 6 433
7: 1 1 10 0
8: 1 2 20 -9
9: 1 3 30 -27
10: 1 4 40 -54
11: 1 5 50 -90
12: 1 6 60 -135
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/435101.html
下一篇:遞回二叉搜索樹實作-Python
