获取r中每一行的相关性


数据如下:
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))

tmp
#> # 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

我想获得井和eur之间的相关性,并存储在一个新的列中,第一行将是1,第二个值将是(2:1,21:23)的相关性,第三个值将是(3:1,45:21)等。我尝试了cor (tmp$wells, tmp$eur),但它只返回一个值。

1)定义由井和eur组成的单个复向量,然后将其与宽度为1,2,3,…的rollapplyr一起使用。, n()应用指示函数提取实、虚分量并取其相关性。注意,数字与自身的相关性是未定义的,而不是1。

library(dplyr)
library(zoo)
cor_ <- function(x) cor(Re(x), Im(x))
tmp %>%
group_by(id) %>%
mutate(cor = rollapplyr(wells + eur * 1i, 1:n(), cor_)) %>%
ungroup

给:

# A tibble: 16 x 4
id wells   eur    cor
<dbl> <int> <dbl>  <dbl>
1     1     1    21 NA    
2     1     2    23  1    
3     1     3    45  0.901
4     1     4    43  0.891
5     1     5    23  0.318
6     1     6    55  0.620
7     1     7    34  0.473
8     1     8    44  0.521
9     1     9    65  0.684
10     1    10    56  0.728
11     1    11    66  0.790
12     1    12    76  0.841
13     1    13    87  0.877
14     1    14    67  0.867
15     1    15    76  0.878
16     1    16    56  0.817

2)这种替代方法使用相同的包并给出相同的结果,但不使用复数。(1)的优点是无论选择哪两列,我们都可以使用相同的cor_。

tmp %>%
group_by(id) %>%
mutate(cor = rollapplyr(1:n(), 1:n(), function(ix) cor(wells[ix], eur[ix]))) %>%
ungroup

最新更新