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

时间:2018-10-14 10:04:19

标签: r dataframe conditional

我有一个这样的数据框:

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 :(得分:1)

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