#r #list #split #data.table #data-manipulation
#r #Список #разделить #data.table #манипулирование данными
Вопрос:
пример с требуемым результатом (достигается жестким кодированием)
DT <- data.table(val=1:8, f=c('a','b','b','a','b','a','a','c'))
required <- list(DT[f=='a'], DT[f=='b'], DT[f=='c'])
Комментарии:
1. Есть
split
метод для data.tables.split(DT, by='f')
должен это сделать.2. @RuiBarradas и наоборот
rbindlist
?3. Да, это так.
rbindlist(split(DT, by='f'))
выдает оригиналDT
со строками в порядке a, b, c.4. @RuiBarradas пожалуйста, оставьте свой комментарий в качестве ответа
Ответ №1:
split
Для объектов класса есть метод "data.table"
. Но в отличие от метода base R для data.frames, есть аргумент by
, для которого нужны имена столбцов в кавычках.
От help('split.data.table')
, мой акцент:
Подробности
Аргумент f предназначен только для согласованности в использовании метода data.frame. Рекомендуется вместо этого использовать аргумент by, это будет быстрее, гибче и по умолчанию сохранит порядок в соответствии с порядком в данных.
split(DT, by = 'f')
#$a
# val f
#1: 1 a
#2: 4 a
#3: 6 a
#4: 7 a
#
#$b
# val f
#1: 2 b
#2: 3 b
#3: 5 b
#
#$c
# val f
#1: 8 c
Обратное rbindlist
. Он выдает исходный DT со строками в порядке a
, b
, c
.
rbindlist(split(DT, by = 'f'))
# val f
#1: 1 a
#2: 4 a
#3: 6 a
#4: 7 a
#5: 2 b
#6: 3 b
#7: 5 b
#8: 8 c