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

如何在单一管道步骤中汇总数据并绑定新行至现有data frame?

问题描述

我正在读取加利福尼亚州58个县的多年公开气温数据,希望生成每日全州平均值的汇总结果,并在单一管道(pipe)步骤中将这些均值作为新行添加到包含县数据的data frame中。

目前我通过三步完成此操作:

  • 读取县数据
  • 单独计算均值
  • 将新生成的均值行绑定到原数据

以下是reprex示例:

#### Reprex ####
library(tidyverse)

df1 <-
  data.frame(
    name = toupper(c(rep(letters[1:5], each=5))),
    x = as.character(c(rnorm(25, 55, 10)))
  )

df2 <- df1 |>
  group_by(name) |>
  mutate(x = mean(as.numeric(x), na.rm = TRUE)) |> 
  ungroup() |> 
  select(name, x) |>
  unique() |>
  mutate(name = "Z")
  
df <- rbind(df1, df2) 

我尝试了两种方法但均失败,抛出错误:Error in UseMethod("summarise") : no applicable method for 'summarise' applied to an object of class "c('double', 'numeric')":

#Test 1
df <- 
  data.frame(
    name = toupper(c(rep(letters[1:5], each=5))),
    x = as.character(c(rnorm(25, 55, 10)))
  ) |> 
  group_by(name) |> 
  select(name, x) |>
  do(bind_rows(., data.frame(name = "Z", 
                             mutate(x = mean(as.numeric(.$x), na.rm = TRUE))))) |>
  ungroup()
  
#Test 2
df <- 
  data.frame(
    name = toupper(c(rep(letters[1:5], each=5))),
    x = as.character(c(rnorm(25, 55, 10)))
  ) |> 
  group_by(name) |> 
  select(name, x) |>
  do(bind_rows(., data.frame(name = "Z", 
                             mutate(x = summarize(mean(as.numeric(.$x), na.rm = TRUE)))))) |>
  ungroup()
解决方案

可以用bind_rows()直接在管道内完成原数据与汇总行的合并,无需拆分步骤。核心思路是先计算全州均值生成单行数据框,再与原数据绑定,整个流程在一个管道中实现:

library(tidyverse)

df <- 
  data.frame(
    name = toupper(c(rep(letters[1:5], each=5))),
    x = as.character(c(rnorm(25, 55, 10)))
  ) |>
  {
    original <- .
    # 计算全州所有数据的均值,匹配原数据的字符类型
    summary_row <- original |>
      mutate(x = as.numeric(x)) |>
      summarise(x = mean(x, na.rm = TRUE)) |>
      mutate(name = "Z", x = as.character(x))
    # 绑定原数据和汇总行
    bind_rows(original, summary_row)
  }

错误原因说明

之前的测试代码出错是因为:

  • do()内部的mutate用法错误,mutate需要作用于数据框,但你直接传入了向量计算结果,导致类型不匹配
  • summarise嵌套在mutate里的用法有误,应该直接生成汇总值

另外注意:你原代码中df2计算的是每个县的均值后统一改为"Z",这并非全州均值(全州均值是所有县所有数据的平均值)。如果你的需求是每个县均值的平均值(即先算每个县的日均温,再算全州日均温),可以调整汇总逻辑:

df <- 
  data.frame(
    name = toupper(c(rep(letters[1:5], each=5))),
    x = as.character(c(rnorm(25, 55, 10)))
  ) |>
  {
    original <- .
    summary_row <- original |>
      mutate(x = as.numeric(x)) |>
      group_by(name) |>
      summarise(x = mean(x, na.rm = TRUE)) |>  # 先算每个县的均值
      ungroup() |>
      summarise(x = mean(x, na.rm = TRUE)) |>  # 再算全州均值
      mutate(name = "Z", x = as.character(x))
    bind_rows(original, summary_row)
  }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:17:07