字符列拆分为 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)))]
我有一个带有文本字符列的小标题,块有共同的起始值和结束值,我想将它们分成列表列。
我想将以“*****”开头并以 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)))]