Предположим, у меня есть таблица данных, в которой каждая строка состоит из двух векторов:
- Вектор "до вычитания".
- Вектор "после вычитания".
Предварительное вычитание - это самый левый столбец, а столбец - самый правый столбец с суффиксом "prm" в конце.
Например:
#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 должен уменьшаться по элементам вправо, прежде чем воздействовать на более левые элементы.Первый ряд VIOLATES LIFO, потому что
(2, 9, 0) --> (0, 9, 0)
должен был вычесть 2 из 9 перед 2 в самом левом блоке.
Я хотел бы включить в поднабор ТОЛЬКО строки, в которых есть столбцы 'prm' в качестве вычитаний LIFO столбцов, не являющихся prm.Например,
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).Считайте «с» самым последним, а «а» - наименее недавним.
Общее количество единиц в этом векторе 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)