如何用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
相关产品推荐
相关产品推荐

