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
相关产品推荐
相关产品推荐

