忽略NA值计算数据框指定列与其余列协方差的简洁方法
解决方案
以下两种实现均不需要编写for循环,代码简洁且计算效率更高。
前置准备:示例数据加载
先将你提供的示例数据存入变量:
df <- structure(list(Date = structure(c(18628, 18629, 18630, 18631, 18632, 18633, 18634, 18635, 18636, 18637), class = "Date"), X1 = c(NA, NA, NA, NA, 1.16092168555067, 0.591202293337843, -0.279052669225263, -0.780435476613128, -0.852870619718068, -0.708611614262357), X2 = c(NA, NA, -0.222767493777229, 1.50328295132467, 0.934670132217215, 1.37678188537077, 0.343280062984192, 1.23279081824003, -1.08074586121729, 0.208120194894818), X3 = c(NA, NA, NA, NA, NA, 1.72057538716556, 1.37803710718683, 1.24717457500191, -0.00930256437131184, 0.491423553538728), X4 = c(1.15304498847709, -0.154433520961086, -0.361871232243227, -0.981985961481073, 0.596667113671836, -0.0960746707238904, -1.53792603627306, 1.00296956396233, 0.128292175597246, -1.12744557711187)), row.names = c(NA, -10L), class = "data.frame")
方案1:Base R实现(无需加载额外包)
用sapply批量遍历待计算列,按规则过滤NA后计算协方差:
# 提取参考列数据 ref_value <- df$X4 # 筛选排除日期列、参考列之外的所有待计算列 target_cols <- df[, setdiff(colnames(df), c("Date", "X4"))] # 批量计算协方差 cov_result <- sapply(target_cols, function(x) { # 仅过滤当前待计算列的NA,保留对应行的参考列数据 valid_idx <- !is.na(x) cov(x[valid_idx], ref_value[valid_idx]) })
运行后得到的cov_result是自带列名的协方差向量,可直接使用。
方案2:tidyverse风格实现
如果习惯tidyverse语法,用purrr::map_dbl实现逻辑更清晰:
library(tidyverse) cov_result <- df %>% select(-Date, -X4) %>% # 剔除不需要参与计算的列 map_dbl(.f = ~ cov(.x[!is.na(.x)], df$X4[!is.na(.x)]))
结果示例
两种方案计算结果完全一致,示例数据运行后输出为:
X1 X2 X3 -0.198228573 -0.008301889 -0.269736656
内容的提问来源于stack exchange,提问作者Osvaldo Assunção
相关产品推荐
相关产品推荐

