如何拆分以分号分隔的DataFrame嵌套数据?
规整非规整Tibble数据的Tidyverse方案
针对你的非规整Tibble数据,我们可以用tidyverse工具链将其转换为适合分析和可视化的整洁格式,同时兼容存在无需拆分列的场景。以下是两种实用方案:
方案1:合并为带分类的单一整洁数据框
此方案将食物和颜色数据整合到同一数据框中,通过category列区分类型,适合需要同时分析或对比两类数据的场景。
library(tidyverse) # 转换为整洁格式 tidy_combined <- data %>% # 将需要拆分的列转为键值对格式 pivot_longer( cols = c(`Favorite foods`, `Preferred colors`), # 指定仅拆分这两列 names_to = "category", values_to = "item" ) %>% # 按分号+空格拆分每个item为单独行 separate_longer_delim( cols = item, delim = "; ", na.rm = FALSE # 保留NA值(如Marge的颜色数据) )
转换后的数据结构示例:
# A tibble: 19 × 3 `Full name` category item <chr> <chr> <chr> 1 Homer Favorite foods key lime pie 2 Homer Favorite foods celery 3 Homer Favorite foods fried rice 4 Homer Preferred colors green 5 Homer Preferred colors red 6 Marge Favorite foods celery 7 Marge Favorite foods ice cream 8 Marge Preferred colors NA 9 Mr. Burns Favorite foods fried rice 10 Mr. Burns Favorite foods apple 11 Mr. Burns Favorite foods fried chicken 12 Mr. Burns Favorite foods ice cream 13 Mr. Burns Preferred colors orange 14 Mr. Burns Preferred colors purple 15 Krusty Favorite foods celery 16 Krusty Favorite foods key lime pie 17 Krusty Favorite foods apple 18 Krusty Preferred colors red 19 Krusty Preferred colors blue
方案2:拆分为独立的食物和颜色数据框
如果你需要分别分析食物和颜色数据,可将它们拆分为两个独立的整洁数据框:
# 生成食物数据框 tidy_foods <- data %>% select(`Full name`, `Favorite foods`) %>% separate_longer_delim(`Favorite foods`, delim = "; ", na.rm = FALSE) %>% rename(food = `Favorite foods`) # 重命名列以提高可读性 # 生成颜色数据框 tidy_colors <- data %>% select(`Full name`, `Preferred colors`) %>% separate_longer_delim(`Preferred colors`, delim = "; ", na.rm = FALSE) %>% rename(color = `Preferred colors`)
食物数据框示例:
# A tibble: 12 × 2 `Full name` food <chr> <chr> 1 Homer key lime pie 2 Homer celery 3 Homer fried rice 4 Marge celery 5 Marge ice cream 6 Mr. Burns fried rice 7 Mr. Burns apple 8 Mr. Burns fried chicken 9 Mr. Burns ice cream 10 Krusty celery 11 Krusty key lime pie 12 Krusty apple
颜色数据框示例:
# A tibble: 7 × 2 `Full name` color <chr> <chr> 1 Homer green 2 Homer red 3 Marge NA 4 Mr. Burns orange 5 Mr. Burns purple 6 Krusty red 7 Krusty blue
兼容无需拆分列的场景
如果你的数据中存在无需拆分的列(如年龄、职业等单一值列),只需调整代码保留这些列即可:
- 在方案1中,
pivot_longer仅指定需要拆分的列,其他列会自动保留在每一行中。 - 在方案2中,将无需拆分的列加入
select语句即可,例如:select(Full name, Age,Favorite foods)。
内容的提问来源于stack exchange,提问作者hpy
相关产品推荐
相关产品推荐

