gpt4 book ai didi

r - 列值增量更新

转载 作者:行者123 更新时间:2023-12-01 12:27:21 25 4
gpt4 key购买 nike

各位 R-Stackoverflowers,

我有一个包含 2 列的数据表,我正在尝试根据 2 个现有列值和前一行的新列计算值来计算新的第三列。

我一直在查看论坛并尝试了几个答案,但我没有找到正确的答案。我希望你能帮助我。

这是一个可重现的例子:

error <- c(1,1,0,0,0,1,1,1,1,0)
trigger <- c(FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE)
expected <- c(1,2,0,0,0,1,2,3,4,0)
DTtest <- data.table(error, trigger, expected)
DTtest
error trigger expected
1: 1 FALSE 1
2: 1 TRUE 2
3: 0 FALSE 0
4: 0 FALSE 0
5: 0 FALSE 0
6: 1 FALSE 1
7: 1 TRUE 2
8: 1 TRUE 3
9: 1 TRUE 4
10: 0 FALSE 0

“预期”列包括我希望使用“错误”和“触发”列计算的值。我想应用的公式如下:

if(trigger) {
new_column = new_column(previous_row) + 1
} else {
new_column = error
}

我的第一个尝试是直接使用 ifelse 来更新新列。我发现我实际上必须初始化新列才能运行:

DTtest <- DTtest[, impact:=0]
DTtest[, impact:=ifelse(trigger, lag(impact)+1, error)]

此选项确实会计算新列“影响”,但结果与我在 Excel 中计算列的预期值不匹配(我无法对整个数据表执行此操作,因为它非常大):

    error trigger expected impact
1: 1 FALSE 1 1
2: 1 TRUE 2 1
3: 0 FALSE 0 0
4: 0 FALSE 0 0
5: 0 FALSE 0 0
6: 1 FALSE 1 1
7: 1 TRUE 2 1
8: 1 TRUE 3 1
9: 1 TRUE 4 1
10: 0 FALSE 0 0

然后我尝试了一个 for 循环,但结果也不正确:

for(index in nrow(DTtest)){
imp <- 0
if(index==1){
imp <- DTtest[index]$error
} else {
imp <- DTtest[index-1]$impact+1
}
set(DTtest, i=index, j=as.integer(4), value=imp )
}

我感觉 lag(impact) 由于某种原因没有得到更新值,但我想不出为什么。

你能帮帮我吗? .

谢谢!

最佳答案

这可能是代码打高尔夫球,但我喜欢我的代码冗长:

DTtest[, impact := error]

#add a TRUE before each trigger run
DTtest[, trigger1 := trigger | shift(trigger, 1L, fill = FALSE, type = "lead")]

#IDs for by
DTtest[, rleid := rleid(trigger1)]

#cumsum by
DTtest[(trigger1), impact := cumsum(impact), by = rleid]

# error trigger expected impact trigger1 rleid
# 1: 1 FALSE 1 1 TRUE 1
# 2: 1 TRUE 2 2 TRUE 1
# 3: 0 FALSE 0 0 FALSE 2
# 4: 0 FALSE 0 0 FALSE 2
# 5: 0 FALSE 0 0 FALSE 2
# 6: 1 FALSE 1 1 TRUE 3
# 7: 1 TRUE 2 2 TRUE 3
# 8: 1 TRUE 3 3 TRUE 3
# 9: 1 TRUE 4 4 TRUE 3
#10: 0 FALSE 0 0 FALSE 4

关于r - 列值增量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37963275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com