字符列拆分为 tibble 中的列表列

Character column split into list column in tibble

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

我想将以“*****”开头并以 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]>

这是一种 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 (v0.3.0)

创建于 2021-01-31

您可以使用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)

我们也可以使用

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