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

如何在分组下使用tidyr的fill函数合并时序数据并填充NA

分组填充并按TIMESTAMP去重的正确实现

方法一:使用tidyr::fill

你之前的代码错误在于把fill嵌套在mutate系列函数内部调用,fill本身是针对数据框的行填充函数,无需放在mutate里执行。正确流程是分组后先完成全列填充,再保留每组一行数据:

library(dplyr)
library(tidyr)

no_dupped_records <- dupped_records |>
  group_by(TIMESTAMP) |>
  # 先向上填充,再向下填充,确保同组内非NA值覆盖整组
  fill(everything(), .direction = "up") |>
  fill(everything(), .direction = "down") |>
  # 每个TIMESTAMP保留一行(此时同组所有行内容一致)
  slice(1) |>
  ungroup()

如果同组内非NA值分散,up+down的组合能确保所有行都被填充为该组有效数据;若某列全为NA,填充后依然保留NA,完全符合需求。

方法二:使用dplyr::coalesce

完全可以用coalesce实现需求,利用它“取第一个非NA值”的特性,分组后对每列聚合出该组的有效值(全NA则返回NA):

library(dplyr)

no_dupped_records <- dupped_records |>
  group_by(TIMESTAMP) |>
  summarise(
    across(everything(), ~dplyr::coalesce(!!!.)),
    .groups = "drop"
  )

这里!!!.的作用是把当前列的所有行值展开为coalesce的参数,自动提取该列第一个非NA值;若列内全是NA则返回NA。summarise会自动按TIMESTAMP分组生成一行数据,无需额外去重操作。

你之前代码的问题说明

  • 第一段代码mutate_all(fill(everything(), .direction = 'up')):mutate_all需要接收逐列处理的函数(比如~replace_na(., 0)),但fill是数据框级别的行操作,不适合作为mutate_all的参数,因此报错。
  • 第二段代码mutate(across(fill(everything(), .direction = 'up'))):across需要针对单列的转换逻辑,fill无法作用于单个列的向量,因此代码执行后无任何效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:19:51