从斜杠分隔文本提取指定内容并生成新列的R技术需求
从tibble字符串列中提取层级内容
现有如下tibble格式数据:
# A tibble: 60 × 1 characteristicsMore <chr> 1 "/es/comprar/viviendas/torrox/urbanizacion-santa-rosa/calefaccion/l|/es/comprar/viviendas/torrox/urbanizacion-santa-rosa/terraza… 2 "" 3 "/es/comprar/viviendas/burgos-capital/san-pedro-y-san-felices/calefaccion/l" 4 "" 5 "/es/comprar/viviendas/mancha-real/todas-las-zonas/calefaccion/l|/es/comprar/viviendas/mancha-real/todas-las-zonas/terraza/l|/es… 6 "/es/comprar/viviendas/torrelavega/centro/calefaccion/l" 7 "" 8 "" 9 "/es/comprar/viviendas/san-vicente-del-raspeig-sant-vicent-del-raspeig/haygon-universidad/calefaccion/l|/es/comprar/viviendas/sa…
需要从characteristicsMore列的斜杠分隔字符串中提取指定内容:
- 提取第4层级内容(如
torrox)作为col1 - 提取第5层级内容(如
urbanizacion-santa-rosa)作为col2 - 若单元格内存在以
|分隔的多观测,提取每个观测的第6层级内容(如calefaccion、terraza),以|拼接后作为col3
期望输出示例:
col1 col2 col3 torrox urbanizacion-santa-rosa calefaccion|terraza "" "" "" burgos-capital san-pedro-y-san-felices calefaccion
完整数据结构:
df = structure(list(characteristicsMore = c("/es/comprar/viviendas/torrox/urbanizacion-santa-rosa/calefaccion/l|/es/comprar/viviendas/torrox/urbanizacion-santa-rosa/terraza/l|/es/comprar/viviendas/torrox/urbanizacion-santa-rosa/piscina/l", "", "/es/comprar/viviendas/burgos-capital/san-pedro-y-san-felices/calefaccion/l", "", "/es/comprar/viviendas/mancha-real/todas-las-zonas/calefaccion/l|/es/comprar/viviendas/mancha-real/todas-las-zonas/terraza/l|/es/comprar/viviendas/mancha-real/todas-las-zonas/piscina/l", "/es/comprar/viviendas/torrelavega/centro/calefaccion/l", "", "", "/es/comprar/viviendas/san-vicente-del-raspeig-sant-vicent-del-raspeig/haygon-universidad/calefaccion/l|/es/comprar/viviendas/san-vicente-del-raspeig-sant-vicent-del-raspeig/haygon-universidad/terraza/l|/es/comprar/viviendas/san-vicente-del-raspeig-sant-vicent-del-raspeig/haygon-universidad/piscina/l", "", "", "", "/es/comprar/viviendas/moriles/todas-las-zonas/terraza/l", "/es/comprar/viviendas/zamora-capital/ciudad-jardin-vista-alegre/calefaccion/l|/es/comprar/viviendas/zamora-capital/ciudad-jardin-vista-alegre/terraza/l|/es/comprar/viviendas/zamora-capital/ciudad-jardin-vista-alegre/piscina/l", "/es/comprar/viviendas/navalcarnero/centro/calefaccion/l|/es/comprar/viviendas/navalcarnero/centro/terraza/l", "/es/comprar/viviendas/alcaudete/todas-las-zonas/terraza/l", "/es/comprar/viviendas/caravaca-de-la-cruz/todas-las-zonas/terraza/l", "", "/es/comprar/viviendas/paredes-de-nava/todas-las-zonas/calefaccion/l", "/es/comprar/viviendas/ventas-de-huelma/todas-las-zonas/terraza/l|/es/comprar/viviendas/ventas-de-huelma/todas-las-zonas/piscina/l", "", "/es/comprar/viviendas/villa-del-prado/todas-las-zonas/calefaccion/l|/es/comprar/viviendas/villa-del-prado/todas-las-zonas/terraza/l|/es/comprar/viviendas/villa-del-prado/todas-las-zonas/piscina/l", "", "/es/comprar/viviendas/barcelona-capital/el-camp-d-en-grassot-i-gracia-nova/calefaccion/l|/es/comprar/viviendas/barcelona-capital/el-camp-d-en-grassot-i-gracia-nova/terraza/l", "/es/comprar/viviendas/barcelona-capital/el-camp-d-en-grassot-i-gracia-nova/calefaccion/l|/es/comprar/viviendas/barcelona-capital/el-camp-d-en-grassot-i-gracia-nova/terraza/l", "/es/comprar/viviendas/campillos/todas-las-zonas/terraza/l", "", "", "/es/comprar/viviendas/salobrena/centro/calefaccion/l|/es/comprar/viviendas/salobrena/centro/terraza/l", "/es/comprar/viviendas/santander/numancia-san-fernando/calefaccion/l", "/es/comprar/viviendas/sant-joan-despi/les-planes/calefaccion/l", "/es/comprar/viviendas/elgoibar/todas-las-zonas/calefaccion/l", "", "/es/comprar/viviendas/las-torres-de-cotillas/todas-las-zonas/calefaccion/l", "/es/comprar/viviendas/balaguer/todas-las-zonas/calefaccion/l|/es/comprar/viviendas/balaguer/todas-las-zonas/terraza/l", "/es/comprar/viviendas/l-alcudia/todas-las-zonas/terraza/l", "/es/comprar/viviendas/ubeda/todas-las-zonas/calefaccion/l|/es/comprar/viviendas/ubeda/todas-las-zonas/terraza/l|/es/comprar/viviendas/ubeda/todas-las-zonas/piscina/l", "/es/comprar/viviendas/albuixech/todas-las-zonas/calefaccion/l|/es/comprar/viviendas/albuixech/todas-las-zonas/terraza/l", "/es/comprar/viviendas/dolores/todas-las-zonas/terraza/l", "/es/comprar/viviendas/algete/algete-pueblo/calefaccion/l|/es/comprar/viviendas/algete/algete-pueblo/terraza/l|/es/comprar/viviendas/algete/algete-pueblo/piscina/l", "/es/comprar/viviendas/madrid-capital/nino-jesus/calefaccion/l|/es/comprar/viviendas/madrid-capital/nino-jesus/terraza/l", "/es/comprar/viviendas/jaen-capital/renfe-bulevar-1-y-2-fase/calefaccion/l|/es/comprar/viviendas/jaen-capital/renfe-bulevar-1-y-2-fase/terraza/l", "/es/comprar/viviendas/el-molar-madrid/todas-las-zonas/calefaccion/l", "/es/comprar/viviendas/huercal-de-almeria/todas-las-zonas/terraza/l|/es/comprar/viviendas/huercal-de-almeria/todas-las-zonas/piscina/l", "", "/es/comprar/viviendas/oria/todas-las-zonas/terraza/l|/es/comprar/viviendas/oria/todas-las-zonas/piscina/l", "/es/comprar/viviendas/granada-capital/centro-sagrario/calefaccion/l|/es/comprar/viviendas/granada-capital/centro-sagrario/terraza/l|/es/comprar/viviendas/granada-capital/centro-sagrario/piscina/l", "/es/comprar/viviendas/finestrat/cala-de-finestrat/terraza/l", "/es/comprar/viviendas/andujar/todas-las-zonas/piscina/l", "/es/comprar/viviendas/collado-villalba/villalba-estacion/calefaccion/l|/es/comprar/viviendas/collado-villalba/villalba-estacion/terraza/l", "/es/comprar/viviendas/torrelavega/nueva-ciudad/calefaccion/l", "", "/es/comprar/viviendas/pamplona-iruna/chantrea/calefaccion/l", "", "", "", "/es/comprar/viviendas/aguilas/el-rubial/terraza/l|/es/comprar/viviendas/aguilas/el-rubial/piscina/l", "/es/comprar/viviendas/sondika/todas-las-zonas/calefaccion/l", "/es/comprar/viviendas/barcelona-capital/la-barceloneta/calefaccion/l", "/es/comprar/viviendas/albacete-capital/pedanias-extrarradio/calefaccion/l|/es/comprar/viviendas/albacete-capital/pedanias-extrarradio/terraza/l" )), row.names = c(NA, -60L), class = c("tbl_df", "tbl", "data.frame" ))
解决方案
使用tidyverse工具链处理,步骤如下:
- 保留原始行号,用于后续聚合多观测结果;
- 将空字符串替换为
NA,避免拆分报错; - 按
|拆分多观测为单独行; - 按
/拆分字符串层级,直接提取目标位置的内容; - 按原始行号分组,将
col3的多值用|拼接。
完整代码:
library(tidyverse) # 保留原始行号 df_with_row <- df %>% mutate(original_row = row_number()) result <- df_with_row %>% # 空字符串转NA mutate(characteristicsMore = na_if(characteristicsMore, "")) %>% # 按|拆分多观测 separate_rows(characteristicsMore, sep = "\\|") %>% # 按/拆分层级,直接提取目标列(忽略不需要的层级) separate(characteristicsMore, into = c(NA, NA, NA, NA, "col1", "col2", "col3_part", NA), sep = "/", fill = "right") %>% # 按原始行聚合 group_by(original_row) %>% summarise( col1 = first(col1) %||% "", col2 = first(col2) %||% "", col3 = ifelse(all(is.na(col3_part)), "", paste(na.omit(col3_part), collapse = "|")) ) %>% # 移除行号列 select(-original_row) # 查看前3行结果 print(head(result, 3))
运行结果
前3行输出如下:
# A tibble: 3 × 3 col1 col2 col3 <chr> <chr> <chr> 1 torrox urbanizacion-santa-rosa calefaccion|terraza|piscina 2 "" "" "" 3 burgos-capital san-pedro-y-san-felices calefaccion
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

