如何用tidyverse/stringr插入空字符串使每行含10个_分隔词
问题描述
- 如何为数据框的
word列每行补充_''_格式的空字符串,让每行恰好包含10个用_分隔的元素?优先采用tidyverse/stringr方案。 - 将所有行合并到单个单元格中,合并前需保证每行已有10个元素,以便后续通过JS代码
split('_').slice(v,v+10).join("<br>")按10个元素拆分展示。
数据示例:
> head(dfLong, 10) # A tibble: 5 x 1 word <chr> 1 Jason_Oscar_Maleeka_Janet_Gabriel_Raheema_Bryce_Nasreen_Hishaam_Thadduse 2 Marcos_Daijah_Chassity_Carlito_Chidiebere_Matthew_Maureene_Jillian_Markus_Aaron 3 Ramziyya_Marquez_Kiera_Farajallah_Larisa_Davier_Shujaa_Vincent_Orlando_Joseph 4 Desean_Chelsea_Faadil_Christopher_Aarifa_Joel_Matthew_Jacob_Aeones_Matthew 5 Jacob_Savannah_Nadia_Kaleem ### 需要修改的行
期望输出:
1 Jason_Oscar_Maleeka_Janet_Gabriel_Raheema_Bryce_Nasreen_Hishaam_Thadduse 2 Marcos_Daijah_Chassity_Carlito_Chidiebere_Matthew_Maureene_Jillian_Markus_Aaron 3 Ramziyya_Marquez_Kiera_Farajallah_Larisa_Davier_Shujaa_Vincent_Orlando_Joseph 4 Desean_Chelsea_Faadil_Christopher_Aarifa_Joel_Matthew_Jacob_Aeones_Matthew 5 Jacob_Savannah_Nadia_Kaleem_''_''_''_''_''_'' ## 示例格式
数据结构:
dput(df) structure(list(word = c("Jason_Oscar_Maleeka_Janet_Gabriel_Raheema_Bryce_Nasreen_Hishaam_Thadduse", "Marcos_Daijah_Chassity_Carlito_Chidiebere_Matthew_Maureene_Jillian_Markus_Aaron", "Ramziyya_Marquez_Kiera_Farajallah_Larisa_Davier_Shujaa_Vincent_Orlando_Joseph", "Desean_Chelsea_Faadil_Christopher_Aarifa_Joel_Matthew_Jacob_Aeones_Matthew", "Jacob_Savannah_Nadia_Kaleem")), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))
解决方案
步骤1:补充空字符串至每行10个元素
利用tidyverse的dplyr和stringr工具,先拆分字符串统计元素数量,再计算需补充的空字符串数量,最后完成拼接:
library(tidyverse) # 加载数据 df <- structure(list(word = c("Jason_Oscar_Maleeka_Janet_Gabriel_Raheema_Bryce_Nasreen_Hishaam_Thadduse", "Marcos_Daijah_Chassity_Carlito_Chidiebere_Matthew_Maureene_Jillian_Markus_Aaron", "Ramziyya_Marquez_Kiera_Farajallah_Larisa_Davier_Shujaa_Vincent_Orlando_Joseph", "Desean_Chelsea_Faadil_Christopher_Aarifa_Joel_Matthew_Jacob_Aeones_Matthew", "Jacob_Savannah_Nadia_Kaleem")), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) # 处理每行,补充空字符串 df_processed <- df %>% mutate( # 拆分字符串为元素列表 word_list = str_split(word, "_"), # 统计当前元素数量 count = map_int(word_list, length), # 计算需要补充的空字符串数量 add_num = 10 - count, # 生成待补充的字符串片段(add_num为0时返回空) add_str = if_else(add_num > 0, str_c(rep("_''", add_num), collapse = ""), ""), # 拼接原字符串与补充片段 word_10 = str_c(word, add_str) ) %>% select(word_10)
处理后结果:
df_processed #> # A tibble: 5 × 1 #> word_10 #> <chr> #> 1 Jason_Oscar_Maleeka_Janet_Gabriel_Raheema_Bryce_Nasreen_Hishaam_Thadduse #> 2 Marcos_Daijah_Chassity_Carlito_Chidiebere_Matthew_Maureene_Jillian_Markus_Aaron #> 3 Ramziyya_Marquez_Kiera_Farajallah_Larisa_Davier_Shujaa_Vincent_Orlando_Joseph #> 4 Desean_Chelsea_Faadil_Christopher_Aarifa_Joel_Matthew_Jacob_Aeones_Matthew #> 5 Jacob_Savannah_Nadia_Kaleem_''_''_''_''_''_''
步骤2:合并所有行到单个单元格
用str_c将处理后的所有行合并为连续的_分隔字符串,适配后续JS处理逻辑:
merged_str <- df_processed %>% pull(word_10) %>% str_c(collapse = "_")
合并后的字符串可直接用于JS代码:
// v为起始索引,按10个元素拆分并换行展示 const splitArr = merged_str.split('_').slice(v, v+10).join("<br>");
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

