我需要根据另一表中的信息来更新表的子集:
main_dt = data.table(ID = 1:3, flag=c(TRUE,TRUE,FALSE), treatment_id = c(1,2,1), total_cost = 0)
costs_dt = data.table(treatment_id = 1:3, treatment_cost = c(3,5,8))
main_dt
ID flag treatment_id total_cost
<int> <lgcl> <num> <num>
1: 1 TRUE 1 0
2: 2 TRUE 2 0
3: 3 FALSE 1 0
cost_dt
treatment_id treatment_cost
<int> <num>
1: 1 3
2: 2 5
3: 3 8
我想最终得到:
> main_dt
ID flag treatment_id total_cost
<int> <lgcl> <num> <num>
1: 1 TRUE 1 3
2: 2 TRUE 2 5
3: 3 FALSE 1 0
我一直在尝试做类似的事情:
main_dt[flag==TRUE,][costs_dt, total_cost := total_cost + treatment_cost, on="treatment_ID", nomatch=NULL]
但这是错误的,因为它具有a:= sigsment and nomatch。如果我删除Nomatch,它似乎仍然不起作用。显然,我可以没有标志== true加入,但是我不想更新的行。另外,如果我不进行内部连接,我最终会与一堆NAS一起进行处理_ID = 3。我觉得这应该是完全微不足道的,但我正在努力弄清楚……
您可以使用
fifelse
> library(data.table)
> main_dt[costs_dt, on = "treatment_id", total_cost := fifelse(flag, total_cost + treatment_cost, total_cost)]
> main_dt
ID flag treatment_id total_cost
<int> <lgcl> <num> <num>
1: 1 TRUE 1 3
2: 2 TRUE 2 5
3: 3 FALSE 1 0