如何在向量与数据框列间应用自定义函数及计算列间Phi比例
嘿,我来帮你搞定这个不用循环就能计算列间自定义统计量的问题!咱们分两种场景来实现,完全适配你的需求:
1. 两个数据框所有列两两应用自定义函数
首先先把你的矩阵示例转换成数据框(毕竟你实际要用数据框),同时定义好自定义函数(这里用cor做示例,你可以直接替换成Phi比例的计算逻辑):
set.seed(123) # 设种子让结果可复现 df1 <- as.data.frame(matrix(rnorm(30), nrow = 10, ncol = 3)) colnames(df1) <- c("A", "B", "C") df2 <- as.data.frame(matrix(rnorm(30), nrow = 10, ncol = 3)) colnames(df2) <- c("V1", "V2", "V3") # 自定义函数(替换成你的Phi比例计算即可) custom_stat <- function(x, y) { cor(x, y) }
方法一:用outer()快速生成结果矩阵
outer()可以对两个列表的元素两两配对应用函数,咱们只需要把数据框的列转成列表,再包装一下自定义函数就能用:
# 将数据框的列转为列表形式 cols_df1 <- as.list(df1) cols_df2 <- as.list(df2) # 两两计算自定义统计量,生成结果矩阵 result_matrix <- outer(cols_df1, cols_df2, FUN = Vectorize(custom_stat)) # 给矩阵设置行列名,方便查看对应关系 rownames(result_matrix) <- colnames(df1) colnames(result_matrix) <- colnames(df2)
现在result_matrix["A", "V1"]就对应你想要的cust.corr(A,V1)的结果,整个矩阵清晰展示了所有列对的计算值。
方法二:用purrr包更直观地处理组合
如果你习惯tidyverse风格,用purrr的cross2生成所有列对组合,再逐个计算:
library(purrr) # 生成df1和df2所有列的配对组合 col_pairs <- cross2(cols_df1, cols_df2) # 对每个组合应用自定义函数,再整理成矩阵 result_purrr <- map_dbl(col_pairs, ~custom_stat(.x[[1]], .x[[2]])) %>% matrix(nrow = ncol(df1), byrow = TRUE, dimnames = list(colnames(df1), colnames(df2)))
这个方法逻辑更直白,结果和上面的矩阵完全一致。
2. 单个向量与数据框的每一列应用自定义函数
这个场景更简单,用lapply或者purrr的map系列函数就能搞定:
# 选一个目标向量(比如df1的A列) target_vec <- df1$A # 方法1:基础R的lapply vec_result <- lapply(df2, function(col) custom_stat(target_vec, col)) # 转成带列名的向量更方便查看 vec_result <- unlist(vec_result) # 方法2:purrr的map_dbl直接生成数值向量 vec_result_purrr <- map_dbl(df2, ~custom_stat(target_vec, .x))
现在vec_result["V1"]就是目标向量和df2的V1列的计算结果,所有值都对应df2的列名,一目了然。
注意事项
不管你的自定义函数有多复杂(比如Phi比例的计算),只要保证函数接受两个向量作为输入,并返回单个数值结果,上面的方法都完全适用,只需要替换custom_stat为你的实际函数即可。
内容的提问来源于stack exchange,提问作者Gianluca Galazzo
相关产品推荐
相关产品推荐

