Разделить data.frame по столбцам с непоследовательными значениями, обработанными как отдельные группы - PullRequest
2 голосов
/ 18 апреля 2019

Привет! Я пытаюсь разделить свой data.frame в R (на список data.frames) на основе столбца, но чтобы значения в этом столбце изменились, а затем вернулись, они обрабатывались как отдельные группы и разделялись друг от друга.

Например, вот очень простой воспроизводимый пример.

Testdf <- data.frame(x= 1:20,test = rep(c(TRUE,FALSE,TRUE,FALSE),each = 5))

Я могу разделить нормально:

Testdf %>% split(.$test)

но затем TRUE s 1: 5 сгруппированы с TRUE s из 11:15, я хочу эквивалент

Testdf %>% split(rep(1:4,each = 5))

но мои реальные данные очень сложны, и нет стандартного размера группы или подобных вещей.

Есть предложения?

1 Ответ

0 голосов
/ 18 апреля 2019

Основной ключ заключается в создании правильных групп для split

Одной из альтернатив является использование data.table::rleid до split

split(Testdf, data.table::rleid(Testdf$test))


#$`1`
#  x test
#1 1 TRUE
#2 2 TRUE
#3 3 TRUE
#4 4 TRUE
#5 5 TRUE

#$`2`
#    x  test
#6   6 FALSE
#7   7 FALSE
#8   8 FALSE
#9   9 FALSE
#.....

Чистая базовая R-альтернатива, если у вас есть только TRUE / FALSE значение с использованием diff

split(Testdf, cumsum(c(0, diff(Testdf$test)) != 0))

и еще один с rle

split(Testdf, with(rle(Testdf$test), rep(seq_along(values), lengths)))
...