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

