You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何逐行累计计算wells与eur相关系数并存为新列

逐行累计相关系数实现方案

问题说明

现有tibble格式数据集tmp,结构与构建代码如下:

tmp <- tibble::tibble(id = rep(1, 16), wells = 1:16, eur = c(21,23,45,43,23,55,34,44,65,56,66,76,87,67,76,56))

# 数据集预览
#> # A tibble: 16 × 3
#>       id wells   eur
#>    <dbl> <int> <dbl>
#>  1     1     1    21
#>  2     1     2    23
#>  3     1     3    45
#>  4     1     4    43
#>  5     1     5    23
#>  6     1     6    55
#>  7     1     7    34
#>  8     1     8    44
#>  9     1     9    65
#> 10     1    10    56
#> 11     1    11    66
#> 12     1    12    76
#> 13     1    13    87
#> 14     1    14    67
#> 15     1    15    76
#> 16     1    16    56

需要新增列存储wells和eur的累计相关系数,规则为:

  • 第1行取值为1
  • 第n(n≥2)行取值为前n行记录中,wells列1:n取值和eur列前n个值的皮尔逊相关系数
    直接调用全局cor()函数仅能返回全量数据的单个相关系数,无法满足逐行累计计算需求。

实现代码

方案1:tidyverse生态实现(适配tibble操作习惯)

使用dplyr做数据框操作,slider包实现滑动窗口计算,代码简洁可读性强:

library(dplyr)
library(slider)

tmp <- tmp %>%
  mutate(
    cum_cor = slide2_dbl(
      .x = wells,
      .y = eur,
      .f = ~cor(.x, .y),
      .before = Inf # 窗口覆盖从第一行到当前行的所有记录
    )
  )
# 第一行单样本相关系数返回NA,按需求手动修正为1
tmp$cum_cor[1] <- 1

方案2:base R实现(无需安装额外包)

直接用基础R的sapply逐行索引计算,无第三方包依赖:

tmp$cum_cor <- sapply(
  seq_len(nrow(tmp)),
  function(i) {
    if (i == 1) return(1)
    cor(tmp$wells[seq_len(i)], tmp$eur[seq_len(i)])
  }
)

结果说明

  • 两种方案计算结果完全一致,最后一行的累计相关系数和全局调用cor(tmp$wells, tmp$eur)的返回值完全匹配,逻辑自洽
  • 计算得到的前3行cum_cor值分别为1.000、1.000(前2组数据完全线性正相关)、0.901,符合累计计算规则

内容的提问来源于stack exchange,提问作者Solicia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:09:32