【问题标题】:Character column split into list column in tibble字符列拆分为 tibble 中的列表列
【发布时间】:2026-01-14 02:15:01
【问题描述】:

我有一个带有文本字符列的小标题,并且块有共同的起始值和结束值,我想将它们分成列表列。

我想将每个以“*****”开头并以 2 个空行结尾的块分开列出,这样我就可以将它们分开处理。

text_tbl <- tibble(text = c("*****", "abc dfc", "abc dfc", "", "", "*****", "abc dfc", "abc dfc", "", ""))

所以最后,我希望在 tibble 中有一个列表列,其中包含包含“*****”的块,空行不是必需的,但也不会受到伤害。

结果如下所示:

tibble(result = list(c("*****", "abc dfc", "abc dfc", "", ""), c("*****", "abc dfc", "abc dfc", "", "")))

  result   
  <list>   
1 <chr [5]>
2 <chr [5]>

【问题讨论】:

    标签: r tibble


    【解决方案1】:

    这是一种 tidyverse 方法。对于您的示例,它正在工作。但是,它不考虑最后两个空行,而只在开头***** 处查找分隔符。够了吗?

    library(tibble)
    library(dplyr)
    library(tidyr)
    
    text_tbl <- tibble(text = c("*****", "abc dfc", "abc dfc", "", "", "*****", "abc dfc", "abc dfc", "", ""))
    
    text_tbl %>%
      mutate(group = ifelse(text == "*****", row_number(), NA)) %>% 
      fill(group) %>% 
      summarise(result = group_by(., group) %>% group_map(~.x)) 
    
    #> # A tibble: 2 x 1
    #>   result          
    #>   <list>          
    #> 1 <tibble [5 × 1]>
    #> 2 <tibble [5 × 1]>
    

    reprex package 创建于 2021-01-31 (v0.3.0)

    【讨论】:

    • 我认为这会起作用,我必须检查完整的样本。对于一般答案,是否可以在其中使用 contains / starts_with ?如果我想使用其他短语?
    • 我认为你可以使用 mutate(group = ifelse(grepl("phrase", test), row_number(), NA))
    • 是的,您基本上可以使用任何正则表达式函数(base R、stringr 等)来选择字符串。 tidyverse 选择助手仅适用于选择上下文中的列名。
    【解决方案2】:

    您可以使用cumsum 创建组,并使用summarise 将每个组的文本组合为一个列表。

    library(dplyr)
    
    text_tbl %>%
      group_by(group = cumsum(text == '*****')) %>%
      summarise(text = list(text)) %>%
      select(-group)
    
    #   text     
    #  <list>   
    #1 <chr [5]>
    #2 <chr [5]>
    

    或者使用基础 R :

    aggregate(text~group, transform(text_tbl, group = cumsum(text == '*****')), list)
    

    【讨论】:

      【解决方案3】:

      我们也可以使用

      library(data.table)
      setDT(text_tbl)[, .(.(text)), .(group = cumsum(grepl('^\\*{5}$', text)))]
      

      【讨论】: