如何使用R的dplyr包计算两个数据框匹配列的相关系数
R 双数据框匹配列相关系数计算方案
示例数据构造
先复现问题中的测试数据:
library(tidyverse) # 构造data1 a = c(1,2,NA,4,5) b = c(3,4,5,6,7) data1 = tibble(a,b) # 构造data2 a = c(4,2,4,4,9) b = c(3,4,4,6,7) d = c(5,9,3,4,2) data2 = tibble(a,b,d)
需求边界
- 仅对两个数据框的同名列计算皮尔逊相关系数
- 列中存在NA值时自动适配,不因为缺失值中断计算
- data2中存在但data1中不存在的列,对应结果返回NA
- 基于dplyr管道语法实现
实现代码
cor_res <- tibble( # 以data2的列名为遍历基准,保证独有列不遗漏 column = names(data2) ) %>% mutate( corr = map_dbl(column, ~{ # 列不存在于data1直接返回NA if (!.x %in% colnames(data1)) return(NA_real_) # 存在则计算相关,自动成对剔除缺失值 cor(data1[[.x]], data2[[.x]], use = "pairwise.complete.obs") }) )
逻辑说明
运行代码后返回的cor_res是规整的tibble结构,第一列为列名,第二列为对应相关系数:
- 列
a:自动剔除第三行NA值后,基于剩余4组观测计算相关系数 - 列
b:两列无缺失值,直接基于全部观测计算相关 - 列
d:data1中无对应列,直接返回NA
缺失值处理参数调整
cor()函数中use参数可按需调整缺失值处理逻辑:
use = "pairwise.complete.obs":默认使用的成对删除法,仅剔除当前计算的两列对应位置存在NA的观测,数据利用率最高use = "everything":列中存在任意NA时直接返回NAuse = "complete.obs":行删除法,只要任意一列存在NA就剔除整行观测
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

