Получить от первого до последнего элемента каждой группы в виде таблицы данных, используя только операции data.table - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующая таблица данных:

datatable_example <- data.table(a = c(1,1,1,1,2,2,2,3,3,3,3,4,4), b = c('A', 'B', 'B', 'A', 'B', 'B', 'A', 'A', 'B', 'A', 'A', 'A', 'A'))  

 > datatable_example
    a b
 1: 1 A
 2: 1 B
 3: 1 B
 4: 1 A
 5: 2 B
 6: 2 B
 7: 2 A
 8: 3 A
 9: 3 B
10: 3 A
11: 3 A
12: 4 A
13: 4 A

Я хотел бы отфильтровать эту таблицу данных таким образом, чтобы для каждого столбца «a» он сохранял все элементы столбца «b» до последней буквы «B» ". Итак, желаемый результат:

> output
    a b
 1: 1 A
 2: 1 B
 3: 1 B
 4: 2 B
 5: 2 B
 6: 3 A
 7: 3 B

Знаете ли вы, что я могу сделать это с помощью data.table? Я не хотел бы разделять 3 других таблицы данных (используя что-то вроде lapply), а затем rbind или rbindlist их.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вот вариант:

DT[, rn := .I][
    DT[CJ(a, b="B", unique=TRUE), on=.(a, b), mult="last"],
    on=.(a, rn<=rn)]

вывод:

   a b rn i.b
1: 1 A  3   B
2: 1 B  3   B
3: 1 B  3   B
4: 2 B  6   B
5: 2 B  6   B
6: 3 A  9   B
7: 3 B  9   B

данные:

DT <- data.table(a = c(1,1,1,1,2,2,2,3,3,3,3,3,3), 
    b = c('A', 'B', 'B', 'A', 'B', 'B', 'A', 'A', 'B', 'A', 'A', 'A', 'A'))    
1 голос
/ 14 июля 2020

Выбрать строки до последнего "B" значения в каждой группе.

library(data.table)
datatable_example[, .SD[seq_len(max(which(b == 'B')))], a]

#   a b
#1: 1 A
#2: 1 B
#3: 1 B
#4: 2 B
#5: 2 B
#6: 3 A
#7: 3 B
...