如何用向量化函数/lapply/map简化R中构建新DataFrame的重复计算?
简化多列重复计算的几种方法
你可以用purrr(tidyverse生态)或者base R的lapply来批量处理这些重复操作,避免手动写每一列的计算逻辑:
方法一:用tidyverse的map_dfc
这种方法更贴合tidyverse的风格,自动整合结果为dataframe,还能批量处理列名:
library(tidyverse) iris_avg <- iris %>% # 筛选所有数值列(自动排除Species列) select(where(is.numeric)) %>% # 对每一列执行分组求均值的操作,结果按列绑定成dataframe map_dfc(~ colMeans(matrix(.x, nrow = 10))) %>% # 把列名简化成你需要的格式(比如Sepal.Length → SLength) rename_with(~ str_replace_all(.x, c("Sepal" = "S", "Petal" = "P", "\\." = "")))
方法二:base R的lapply实现
如果不想加载tidyverse,用base R也能轻松完成:
# 提取iris中的数值列 num_cols <- iris[sapply(iris, is.numeric)] # 用lapply遍历每一列,执行计算后转成dataframe iris_avg_base <- as.data.frame(lapply(num_cols, function(x) { colMeans(matrix(x, nrow = 10)) })) # 重命名列名匹配需求 colnames(iris_avg_base) <- str_replace_all(colnames(num_cols), c("Sepal" = "S", "Petal" = "P", "\\." = ""))
两种方法得到的结果和你手动写的iris_avg完全一致,而且后续如果要增加列或者调整分组行数(比如把nrow改成5),只需要修改一处参数即可,不用重复修改每一列的代码。
内容的提问来源于stack exchange,提问作者bkelley9
相关产品推荐
相关产品推荐

