R语言:将数据框分割为含连续不重叠类型组的子组
问题描述
需要将R数据框按连续2个互不重叠的Type分割成子组,各组行数不固定。示例数据如下:
df <- data.frame(ID=c('1','1','1','1','1','1','1'), Type=c('a','a','b','c','c','d','d'), value=c(10,2,5,3,7,3,9))
期望输出:
- 子组1包含Type
a和b - 子组2包含Type
c和d
解决方案
可以通过给每个Type分配分组标识,再按标识分割数据框来实现:
# 获取唯一的Type序列 unique_types <- unique(df$Type) # 给每个Type分配分组ID:每2个连续Type归为一组 group_ids <- as.integer(gl(length(unique_types), 2)) # 建立Type到分组ID的映射 type_group_map <- setNames(group_ids, unique_types) # 为原数据框添加分组列 df$group <- type_group_map[df$Type] # 按分组列分割数据框 split_result <- split(df, df$group) # 查看结果 split_result[[1]] split_result[[2]]
代码说明
unique(df$Type)提取数据中所有不重复的Type,得到顺序为c("a","b","c","d")的向量;gl(length(unique_types), 2)生成重复的分组编号:前2个Type对应组1,接下来2个对应组2,以此类推。如果Type总数是奇数,最后一个Type会单独成为一组;setNames建立Type和分组ID的对应关系,方便后续给原数据框打标记;split(df, df$group)根据分组列将数据框拆分成多个子数据框,结果是一个列表,每个元素对应一个子组。
如果需要移除结果中的group列,可以在分割后用lapply处理:
split_result_clean <- lapply(split_result, function(x) x[, !names(x) %in% "group"])
内容的提问来源于stack exchange,提问作者mkmor
相关产品推荐
相关产品推荐

