是否存在可在多个表格间执行逐单元格运算的R函数?
R语言跨多表逐单元格通用运算实现方案
核心思路
要实现任意数量同维度dataframe的逐单元格运算,核心逻辑是提取所有表同一坐标位置的元素作为输入传入指定函数,再将计算结果按原表维度组装,同时兼容任意自定义运算规则。
基础R通用函数实现
无需额外依赖包的原生实现方案,自带输入校验,直接调用即可:
cellwise_apply <- function(df_list, fun = sum, ...) { # 校验所有输入数据框行列维度一致 dim_check <- sapply(df_list, function(x) all(dim(x) == dim(df_list[[1]]))) stopifnot("所有输入的dataframe必须拥有完全相同的行数和列数" = all(dim_check)) row_num <- nrow(df_list[[1]]) col_num <- ncol(df_list[[1]]) # 初始化结果容器 res_mat <- matrix(NA, nrow = row_num, ncol = col_num) # 逐坐标计算 for (i in seq_len(row_num)) { for (j in seq_len(col_num)) { # 提取所有表对应位置的元素组成向量 cell_values <- sapply(df_list, function(df) df[i, j]) res_mat[i, j] <- fun(cell_values, ...) } } # 转换为dataframe,保留原表列名 res_df <- as.data.frame(res_mat) colnames(res_df) <- colnames(df_list[[1]]) return(res_df) }
调用示例
构造测试数据
# 3个同维度测试数据框 df1 <- data.frame(a = c(1, 2, 3), b = c(4, 5, 6)) df2 <- data.frame(a = c(10, 20, 30), b = c(40, 50, 60)) df3 <- data.frame(a = c(100, 200, 300), b = c(400, 500, 600)) df_list <- list(df1, df2, df3)
逐单元格求和(默认功能)
cell_sum_res <- cellwise_apply(df_list)
自定义匿名函数运算
比如计算同一位置所有元素的最大值:
cell_max_res <- cellwise_apply(df_list, fun = function(x) max(x))
purrr生态适配方案
可通过lift_vd改造函数适配pmap的传参规则,解决匿名函数参数数量不固定的问题:
library(purrr) # 逐单元格求和示例 cell_sum_purrr <- pmap(df_list, lift_vd(sum)) %>% matrix(nrow = nrow(df_list[[1]]), ncol = ncol(df_list[[1]])) %>% as.data.frame()
运算维度说明

内容的提问来源于stack exchange,提问作者frandude
相关产品推荐
相关产品推荐

