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

如何用dplyr将数据框指定列的均值替换对应列每行数据?

问题解决:用均值替换指定列的所有行数据

问题说明

需要计算数据框中名称以“Fruits -”开头的各列均值,并用该均值替换对应列的每行数据。尝试使用mutate(across(starts_with()))选中目标列后,用summarize(mean())计算均值替换时报错,即便已将字符列转为数值型仍无法解决。

示例数据

test<-structure(list(`Fruits - Apples` = c("1", "4"), `Fruits - Oranges` = c("2", 
"6"), `Fruits - Bananas` = c("5", "3")), row.names = c(NA, -2L
), class = c("tbl_df", "tbl", "data.frame"))

尝试的代码

nicetry<-test%>%
 mutate(across(everything(), ~as.numeric(.x)))%>%
 mutate(across(starts_with("Fruits -"), ~ summarize(mean = mean(.x, na.rm = T))))

错误信息

Error in `mutate()`:
ℹ In argument: `across(starts_with("Fruits -"), ~summarize(mean = mean(.x, na.rm = T)))`.
Caused by error in `across()`:
! Can't compute column `Fruits - Apples`.
Caused by error in `UseMethod()`:
! no applicable method for 'summarise' applied to an object of class "c('double', 'numeric')"
Run `rlang::last_trace()` to see where the error occurred.

解决方案

错误原因

summarize()是用于生成汇总行的函数,返回长度为1的单值结果,而mutate()的across()要求处理函数返回与原列长度一致的向量,因此直接使用summarize()会触发类型不匹配的错误。

正确代码

利用tidyverse的向量自动广播特性,直接计算列均值并赋值,单值均值会自动填充到列的所有行:

# 分步转换并替换
result <- test %>%
  mutate(across(everything(), as.numeric)) %>%
  mutate(across(starts_with("Fruits -"), ~mean(.x, na.rm = TRUE)))

也可以合并步骤,在计算均值时直接完成类型转换:

# 合并步骤的简洁写法
result <- test %>%
  mutate(across(starts_with("Fruits -"), ~mean(as.numeric(.x), na.rm = TRUE)))

期望输出

# A tibble: 2 × 3
  `Fruits - Apples` `Fruits - Oranges` `Fruits - Bananas`
              <dbl>              <dbl>              <dbl>
1               2.5                  4                  4
2               2.5                  4                  4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:26:07