假设我有一个data.table,每行都由两个向量组成:
例如:
一个后进先出(LIFO)的向量必须从右往左逐元素递减,然后再影响到更左边的元素。第一行违反了LIFO规则,因为
我希望将子集仅包括prm列作为非prm列的LIFO减法的行。例如:
- 一个“预减法”向量。
- 一个“后减法”向量。
例如:
#Sample Data
set.seed(2)
fill = data.table(n=1:7)
Tp=3
for(t in 1:Tp){
set(x = fill, j = paste0('v',t), value = sample(0:10,7))
}
fill[1,paste0('v',3):=0]
fill[5,paste0('v',2):=0]
fill[5,paste0('v',3):=0]
for(t in 1:Tp){
fill[,paste0('v',t,'prm'):=get(paste0('v',t))]
}
fill[1,paste0('v',1,'prm'):=0]
fill[2,paste0('v',2,'prm'):=1]
fill[5,paste0('v',3,'prm'):=1]
fill[7,paste0('v',3,'prm'):=2]
数据:
> fill
n v1 v2 v3 v1prm v2prm v3prm
1: 1 2 9 0 0 9 0
2: 2 7 4 8 7 1 8
3: 3 5 10 9 5 10 9
4: 4 1 8 1 1 8 1
5: 5 6 0 0 6 0 1
6: 6 8 7 0 8 7 0
7: 7 0 0 6 0 0 2
一个后进先出(LIFO)的向量必须从右往左逐元素递减,然后再影响到更左边的元素。第一行违反了LIFO规则,因为
(2, 9, 0) --> (0, 9, 0)
应该在左侧单元上的2被减去9之前,先从9中减去2。我希望将子集仅包括prm列作为非prm列的LIFO减法的行。例如:
n v1 v2 v3 v1prm v2prm v3prm
1: 3 5 10 9 5 10 9
2: 4 1 8 1 1 8 1
3: 6 8 7 0 8 7 0
4: 7 0 0 6 0 0 2
编辑:
LIFO(后进先出)和FIFO(先进先出)是优先考虑某些元素的减法方式。
考虑一个数字向量(a,b,c)。将“c”视为最近的,将“a”视为最不近的。
这个向量中的单位总数是a+b+c。
如果我们从中减去d个单位,在LIFO或FIFO减法下,我们不会从每个元素中减去d,而是从最近的(LIFO)或最不近的(FIFO)逐个元素地减去,直到它被消耗完(至少为0)。
例如
LIFO: (3,2,1) - 5 = (3,2,1 - 5) --> (3,2 -4 ,0) --> (3 -2 ,0,0) --> (1,0,0)
FIFO: (3,2,1) - 5 = (3-5,2,1) --> (0,2 -2 ,1) --> (0 ,0,1)
prmprod1vint1
,prmprod1vint2
等,则可以执行以下操作:fill[n %in% melt(fill, measure.vars=patterns("^prod","^prm"))[, !is.unsorted(value1 - value2), by=.(n)][(V1), n]]
- chinsoon12