我有一个这样的数据框:
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
该怎么做?谢谢。
答案 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)