如何在单一管道步骤中汇总数据并绑定新行至现有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
相关产品推荐
相关产品推荐

