如何按自定义分割符将R的df数据框拆分为嵌套df.listing列表
看起来你想要的是按指定分割符(A和B)将数据框拆分为连续的块,并且合并连续以相同分割符开头的块。原来的split(df, df$m %in% keyword_cutoff)方法只能把数据分成“是分割符”和“不是分割符”两组,显然不符合需求。下面分步实现你的目标:
步骤1:实现阶段1的分割结果
我们可以通过标记分割符的位置,然后用cumsum生成每个块的分组ID,这样就能把每个以分割符开头的连续部分拆分成单独的块:
# 你的原始数据 df <- data.frame(m=c("A","T","W","Z","B","A","A","W","T","K","G","B","T","B")) index_cutoff <- c("A","B") # 标记哪些行是分割符 is_cutoff <- df$m %in% index_cutoff # 生成每个块的分组ID:每次遇到分割符,分组ID+1 group_ids <- cumsum(is_cutoff) # 按分组ID拆分,得到阶段1的结果 df.listing_stage1 <- split(df$m, group_ids)
运行后,df.listing_stage1就是你要的阶段1输出:
df.listing_stage1[[1]] # [1] "A" "T" "W" "Z" df.listing_stage1[[2]] # [1] "B" df.listing_stage1[[3]] # [1] "A" df.listing_stage1[[4]] # [1] "A" "W" "T" "K" "G" df.listing_stage1[[5]] # [1] "B" "T" df.listing_stage1[[6]] # [1] "B"
步骤2:合并连续以相同分割符开头的块
接下来需要把连续以相同分割符开头的块合并成嵌套列表。我们先获取每个块的第一个元素(也就是分割符),然后把连续相同起始符的块归为一组,再拆分成嵌套列表:
# 获取每个块的第一个元素(即分割符) start_vals <- sapply(df.listing_stage1, function(x) x[1]) # 生成合并分组:当当前块的起始符和前一个不同时,分组ID+1 merge_group_ids <- c(1, cumsum(start_vals[-1] != start_vals[-length(start_vals)])) # 按合并分组拆分,得到最终的嵌套列表 df.listing_final <- split(df.listing_stage1, merge_group_ids)
现在查看最终结果,完全符合你的期望:
df.listing_final[[1]] # [[1]] # [1] "A" "T" "W" "Z" df.listing_final[[2]] # [[1]] # [1] "B" df.listing_final[[3]] # [[1]] # [1] "A" # [[2]] # [1] "A" "W" "T" "K" "G" df.listing_final[[4]] # [[1]] # [1] "B" "T" # [[2]] # [1] "B"
如果想要打印时更贴近你展示的格式,可以用lapply遍历打印每个元素:
lapply(df.listing_final, function(block) { lapply(block, function(x) cat(x, "\n")) })
输出:
A T W Z B A A W T K G B T B
内容的提问来源于stack exchange,提问作者beavis11111
相关产品推荐
相关产品推荐

