将字符列切成特定数量的单词
Chop character column into specific number of words
假设我有以下小标题 df
:
id doc doc_word_count
-------------------------------------------
1 Lorem ipsum dolor... 1439
2 Lorem ipsum dolor... 10234
3 Lorem ipsum dolor... 2000
4 Lorem ipsum dolor... 15034
5 Lorem ipsum dolor... 11000
其中 doc_word_count
测量 doc
中的单词数。我想做的是将 doc
列分成每行 500 个(但这个数字是任意的)字。新标题 df_split
应该看起来像这样:
id doc doc_word_count
-------------------------------------------
1 Lorem ipsum dolor... 500
1 labore et dolore... 500
1 totam rem aperiam... 439
2 ... 500
... ... 500
... ... ...
如果最后一个块中没有剩余 500 个单词,那么它应该只存储剩余的单词。我查看了 str_split
和 this Whosebug post 但两者似乎都不相关,因为我没有使用模式或固定字符宽度来拆分字符串。
您可以使用 tidytext::unnest_tokens()
,它实质上是从字符串中提取单词并将数据框转换为每行一个单词。从那里,您可以使用 %/%
运算符创建新的分组并将单词重新组合成一个字符串。
suppressPackageStartupMessages({
library(dplyr)
library(tidytext)
library(stringi)
library(stringr)})
df <- tibble::tribble(~'id', ~'doc', ~'doc_word_count',
1, stringr::word(paste0(stringi::stri_rand_lipsum(1000), collapse = ' '), start = 1, end = 1439), 1439,
2, stringr::word(paste0(stringi::stri_rand_lipsum(1000), collapse = ' '), start = 1, end = 10234), 10234,
3, stringr::word(paste0(stringi::stri_rand_lipsum(1000), collapse = ' '), start = 1, end = 2000), 2000)
head(df)
#> # A tibble: 3 x 3
#> id doc doc_word_count
#> <dbl> <chr> <dbl>
#> 1 1 Lorem ipsum dolor sit amet, litora sollicitudin enim eu.~ 1439
#> 2 2 Lorem ipsum dolor sit amet, sed viverra amet velit ut ve~ 10234
#> 3 3 Lorem ipsum dolor sit amet, auctor convallis tristique v~ 2000
df_split <- df %>%
tidytext::unnest_tokens(word, doc) %>%
dplyr::group_by(id) %>%
dplyr::mutate(new_grp = ((row_number()-1) %/% 500)) %>%
dplyr::group_by(id, new_grp) %>%
dplyr::summarize(doc_word_count = n(),
doc = paste0(word, collapse = ' ')) %>%
dplyr::ungroup() %>%
dplyr::select(id, doc, doc_word_count)
#> `summarise()` regrouping output by 'id' (override with `.groups` argument)
head(df_split)
#> # A tibble: 6 x 3
#> id doc doc_word_count
#> <dbl> <chr> <int>
#> 1 1 lorem ipsum dolor sit amet litora sollicitudin enim eu i~ 500
#> 2 1 semper ullamcorper fames congue metus elementum condimen~ 500
#> 3 1 tincidunt magnis vehicula amet elementum quisque eu vita~ 439
#> 4 2 lorem ipsum dolor sit amet sed viverra amet velit ut vel~ 500
#> 5 2 non arcu netus aptent imperdiet lobortis eros in nulla i~ 500
#> 6 2 sem amet mattis sed feugiat ut arcu amet sed pellentesqu~ 500
假设我有以下小标题 df
:
id doc doc_word_count
-------------------------------------------
1 Lorem ipsum dolor... 1439
2 Lorem ipsum dolor... 10234
3 Lorem ipsum dolor... 2000
4 Lorem ipsum dolor... 15034
5 Lorem ipsum dolor... 11000
其中 doc_word_count
测量 doc
中的单词数。我想做的是将 doc
列分成每行 500 个(但这个数字是任意的)字。新标题 df_split
应该看起来像这样:
id doc doc_word_count
-------------------------------------------
1 Lorem ipsum dolor... 500
1 labore et dolore... 500
1 totam rem aperiam... 439
2 ... 500
... ... 500
... ... ...
如果最后一个块中没有剩余 500 个单词,那么它应该只存储剩余的单词。我查看了 str_split
和 this Whosebug post 但两者似乎都不相关,因为我没有使用模式或固定字符宽度来拆分字符串。
您可以使用 tidytext::unnest_tokens()
,它实质上是从字符串中提取单词并将数据框转换为每行一个单词。从那里,您可以使用 %/%
运算符创建新的分组并将单词重新组合成一个字符串。
suppressPackageStartupMessages({
library(dplyr)
library(tidytext)
library(stringi)
library(stringr)})
df <- tibble::tribble(~'id', ~'doc', ~'doc_word_count',
1, stringr::word(paste0(stringi::stri_rand_lipsum(1000), collapse = ' '), start = 1, end = 1439), 1439,
2, stringr::word(paste0(stringi::stri_rand_lipsum(1000), collapse = ' '), start = 1, end = 10234), 10234,
3, stringr::word(paste0(stringi::stri_rand_lipsum(1000), collapse = ' '), start = 1, end = 2000), 2000)
head(df)
#> # A tibble: 3 x 3
#> id doc doc_word_count
#> <dbl> <chr> <dbl>
#> 1 1 Lorem ipsum dolor sit amet, litora sollicitudin enim eu.~ 1439
#> 2 2 Lorem ipsum dolor sit amet, sed viverra amet velit ut ve~ 10234
#> 3 3 Lorem ipsum dolor sit amet, auctor convallis tristique v~ 2000
df_split <- df %>%
tidytext::unnest_tokens(word, doc) %>%
dplyr::group_by(id) %>%
dplyr::mutate(new_grp = ((row_number()-1) %/% 500)) %>%
dplyr::group_by(id, new_grp) %>%
dplyr::summarize(doc_word_count = n(),
doc = paste0(word, collapse = ' ')) %>%
dplyr::ungroup() %>%
dplyr::select(id, doc, doc_word_count)
#> `summarise()` regrouping output by 'id' (override with `.groups` argument)
head(df_split)
#> # A tibble: 6 x 3
#> id doc doc_word_count
#> <dbl> <chr> <int>
#> 1 1 lorem ipsum dolor sit amet litora sollicitudin enim eu i~ 500
#> 2 1 semper ullamcorper fames congue metus elementum condimen~ 500
#> 3 1 tincidunt magnis vehicula amet elementum quisque eu vita~ 439
#> 4 2 lorem ipsum dolor sit amet sed viverra amet velit ut vel~ 500
#> 5 2 non arcu netus aptent imperdiet lobortis eros in nulla i~ 500
#> 6 2 sem amet mattis sed feugiat ut arcu amet sed pellentesqu~ 500