如何使用R/tidyr将订单附加菜品转换为数据框新行?
问题描述
现有一个存储餐品订单数据的tibble,其中order_item字段记录主订菜品,extra_item1和extra_item2字段记录订单中的附加菜品(值可为空字符串或NA)。需要对该数据进行处理,将每个附加菜品转换为数据框的独立观测行,同时保留附加菜品对应的订单日期,最终得到指定结构的结果(新行的extra_item1和extra_item2为空,且生成连续的新order_nbr)。
初始数据构建代码:
library(tibble) order_nbr <- c(1, 2, 3, 4, 5) order_item <- c("Burger", "Steak", "Lobster", "Pasta", "Salmon") order_date <- c("01-01-2022", "01-02-2022", "01-03-2022", "01-04-2022", "01-05-2022") extra_item1 <- c("Fries", "Fries", "Roll", "", "") extra_item2 <- c("Shake", "Wine", "", "", "") orders <- tibble(order_nbr, order_date, order_item, extra_item1, extra_item2)
初始数据结构:
# A tibble: 5 × 5 order_nbr order_date order_item extra_item1 extra_item2 <dbl> <chr> <chr> <chr> <chr> 1 1 01-01-2022 Burger "Fries" "Shake" 2 2 01-02-2022 Steak "Fries" "Wine" 3 3 01-03-2022 Lobster "Roll" "" 4 4 01-04-2022 Pasta "" "" 5 5 01-05-2022 Salmon "" ""
期望的最终结构:
# A tibble: 10 × 5 order_nbr order_date order_item extra_item1 extra_item2 <dbl> <chr> <chr> <chr> <chr> 1 1 01-01-2022 Burger "" "" 2 2 01-02-2022 Steak "" "" 3 3 01-03-2022 Lobster "" "" 4 4 01-04-2022 Pasta "" "" 5 5 01-05-2022 Salmon "" "" 6 6 01-01-2022 Fries "" "" 7 7 01-02-2022 Fries "" "" 8 8 01-03-2022 Roll "" "" 9 9 01-01-2022 Shake "" "" 10 10 01-02-2022 Wine "" ""
解决方案
可以通过tidyr的pivot_longer将附加菜品字段转换为长格式,过滤空值后,再与处理后的主菜品行合并,最后重新生成连续的order_nbr。
完整处理代码:
library(tidyr) library(dplyr) # 处理主菜品行:保留核心字段,将extra字段设为空 main_items <- orders %>% select(order_nbr, order_date, order_item) %>% mutate(extra_item1 = "", extra_item2 = "") # 处理附加菜品:转长格式、过滤空值、统一结构 extra_items <- orders %>% select(order_nbr, order_date, extra_item1, extra_item2) %>% pivot_longer(cols = starts_with("extra_item"), names_to = "extra_type", values_to = "order_item") %>% filter(order_item != "") %>% select(order_date, order_item) %>% mutate(extra_item1 = "", extra_item2 = "") # 合并数据并生成连续订单编号 final_orders <- bind_rows(main_items, extra_items) %>% mutate(order_nbr = row_number()) %>% select(order_nbr, order_date, order_item, extra_item1, extra_item2) # 查看结果 final_orders
代码解释
- 主菜品行处理:提取原始数据的主菜品核心信息,将附加菜品字段设为空字符串,匹配最终结构要求。
- 附加菜品行处理:
- 用
pivot_longer把两个附加菜品列转为长格式,让每个附加菜品成为独立行; - 过滤掉空字符串的无效附加菜品;
- 统一设置附加菜品字段为空,保证和主菜品行结构一致。
- 用
- 合并与编号:将两类行合并后,用
row_number()生成连续的order_nbr,最后调整列顺序匹配期望结构。
运行上述代码后,即可得到与示例一致的最终tibble。
内容的提问来源于stack exchange,提问作者JRomeo
相关产品推荐
相关产品推荐

