如何使用多个间隔将数据帧子集化为多个子数据帧

How to subset a dataframe using multiple intervals into multiple subdataframes

我有这样一个数据框:

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

怎么做?谢谢。

这并没有回答您的实际问题,但已经完成了工作。在对数据进行子集化之前,使用 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)