Как разделить фрейм данных, используя несколько интервалов, на несколько субдрам - PullRequest
0 голосов
/ 14 октября 2018

У меня есть такой фрейм данных:

df <- data.frame(cb = c(1:10), 
                 type = c('short', 'g_long', 'g_long', 'bg_long', 'bg_long', 'bg_long','g_long','g_long', 'bg_long', 'bg_long'))

> df
   cb    type
1   1   short
2   2  g_long
3   3  g_long
4   4 bg_long
5   5 bg_long
6   6 bg_long
7   7  g_long
8   8  g_long
9   9 bg_long
10 10 bg_long

Я хочу подмножество фреймов данных, у которых все типы bg_long, поэтому я сделал это:

bg_df <- df[df$type == 'bg_long',]

> bg_df
   cb    type
4   4 bg_long
5   5 bg_long
6   6 bg_long
9   9 bg_long
10 10 bg_long

Однако я хочуполучить несколько фреймов данных, значения cb в каждом фрейме данных - это последовательные целые числа.

Ожидаемые результаты:

> bg_df1
   cb    type
4   4 bg_long
5   5 bg_long
6   6 bg_long

> bg_df2
   cb    type
9   9 bg_long
10 10 bg_long

Как это сделать?Спасибо.

1 Ответ

0 голосов
/ 14 октября 2018

Это не отвечает на ваш реальный вопрос, но выполняет работуПеред созданием подмножества данных используйте data.table::rleid для создания индексной переменной.

df$idx <- data.table::rleid(df$type)

# or without data.table package
# rle_type <- rle(df$type)
# df$idx <- rep(seq_len(length(rle_type$lengths)), rle_type$lengths)
df
#   cb    type idx
#1   1   short   1
#2   2  g_long   2
#3   3  g_long   2
#4   4 bg_long   3
#5   5 bg_long   3
#6   6 bg_long   3
#7   7  g_long   4
#8   8  g_long   4
#9   9 bg_long   5
#10 10 bg_long   5

Подмножество, а затем split ваши данные в idx.

bg_df <- df[df$type == 'bg_long',]
split(bg_df, bg_df$idx)
#$`3`
#  cb    type idx
#4  4 bg_long   3
#5  5 bg_long   3
#6  6 bg_long   3

#$`5`
#   cb    type idx
#9   9 bg_long   5
#10 10 bg_long   5

Для удалениястолбец idx:

lapply(bg_lst, `[<-`, "idx", value = NULL)

Если вам нужны эти два набора данных в вашей глобальной среде, выполните

bg_lst <- setNames(bg_lst, paste0("bg_df", 1:2))
list2env(bg_lst, .GlobalEnv)
...