You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

代码解释

  1. 主菜品行处理:提取原始数据的主菜品核心信息,将附加菜品字段设为空字符串,匹配最终结构要求。
  2. 附加菜品行处理:
    • 用pivot_longer把两个附加菜品列转为长格式,让每个附加菜品成为独立行;
    • 过滤掉空字符串的无效附加菜品;
    • 统一设置附加菜品字段为空,保证和主菜品行结构一致。
  3. 合并与编号:将两类行合并后,用row_number()生成连续的order_nbr,最后调整列顺序匹配期望结构。

运行上述代码后,即可得到与示例一致的最终tibble。

内容的提问来源于stack exchange,提问作者JRomeo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:06:48