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

R语言ID列存在空值时如何将dataframe从长表转换为宽表

解决方案

处理这个需求的核心分为两步:首先补全itemnum列的空值、给同属一条记录的行做分组标记,之后按组做长转宽操作即可。

完整可运行代码如下:

library(tidyverse)

# 1. 先处理原始数据格式问题
df <- df %>%
  mutate(
    # 把itemnum的空字符串转为NA,方便后续填充
    itemnum = na_if(itemnum, ""),
    # 把qty列的字符型"NA"转为数值型缺失值
    qty = as.numeric(qty)
  ) %>%
  # 2. 生成独立记录的分组ID:itemnum非空的行就是新组的开始
  mutate(group_id = cumsum(!is.na(itemnum))) %>%
  # 3. 向下填充itemnum的空值,补全所有行的物品编号
  fill(itemnum, .direction = "down") %>%
  # 4. 按分组处理数据
  group_by(group_id, itemnum, month_year) %>%
  mutate(
    # 给同组的物质按顺序编号,用来生成宽表的列名
    sub_idx = row_number(),
    # 取每组第一个非空的qty作为该物品的数量
    qty = first(na.omit(qty))
  ) %>%
  ungroup() %>%
  # 5. 长表转宽表,把同一组的物质分列展示
  pivot_wider(
    names_from = sub_idx,
    values_from = substance,
    names_prefix = "substance"
  ) %>%
  # 6. 调整列顺序,和你需要的输出对齐
  select(itemnum, starts_with("substance"), qty, month_year)

如果需要把substance列的缺失值显示为空字符串而非NA,可以在最后加一行:

df <- df %>% mutate(across(starts_with("substance"), ~replace_na(.x, "")))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:36:06