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

含NA值的DataFrame如何使用pivot_wider实现宽表转换?

如何将含NA填充重复值的DataFrame转换为指定宽格式?

原始数据

初始的DataFrame结构如下:

df = data.frame(day = c("1", NA, NA, NA, NA, "2", NA, NA, NA),
                Unit = c("unit1", NA, NA, NA, "unit2", "unit1", NA, NA, "unit2"),
                Problem = c("Oil", "Engine", "Electric", NA, NA, "Oil", "Power", NA, NA),
                duration = c(2, 5, 1, NA, NA, 1.5, 3, NA, NA))

数据中同天、同单元的重复值用NA填充,直接使用pivot_wider无法得到目标格式,需要先做数据清洗再转换。

解决方案

完整代码如下:

library(tidyverse)

# 原始数据
df = data.frame(day = c("1", NA, NA, NA, NA, "2", NA, NA, NA),
                Unit = c("unit1", NA, NA, NA, "unit2", "unit1", NA, NA, "unit2"),
                Problem = c("Oil", "Engine", "Electric", NA, NA, "Oil", "Power", NA, NA),
                duration = c(2, 5, 1, NA, NA, 1.5, 3, NA, NA))

# 数据转换
df1 <- df %>%
  # 向下填充day和Unit列的NA,补全每行的所属日期和单元
  fill(day, Unit, .direction = "down") %>%
  # 将Problem列的NA替换为"NoProblem",对应的duration设为0
  mutate(
    Problem = replace_na(Problem, "NoProblem"),
    duration = replace_na(duration, 0)
  ) %>%
  # 转换为宽表,缺失的数值用0填充
  pivot_wider(
    names_from = Problem,
    values_from = duration,
    values_fill = 0
  ) %>%
  # 调整列顺序匹配目标格式
  select(day, Unit, Oil, Engine, Electric, Power, NoProblem)

# 查看结果
print(df1)

运行结果

执行后得到的DataFrame与目标格式完全一致:

#   day   Unit Oil Engine Electric Power NoProblem
# 1   1 unit1 2.0      5        1     0         0
# 2   1 unit2 0.0      0        0     0         0
# 3   2 unit1 1.5      0        0     3         0
# 4   2 unit2 0.0      0        0     0         0

关键步骤说明

  • 填充NA:使用fill()函数向下补全day和Unit的缺失值,确保每行都有明确的日期和单元归属,这是后续分组转换的基础。
  • 处理无问题记录:将Problem列的NA替换为"NoProblem",同时把对应duration设为0,匹配目标格式的要求。
  • 宽表转换:pivot_wider中设置values_fill = 0,确保所有未出现的问题类型对应的数值都填充为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:23:11