R - 在数据集中查找前 10 个相关值

R - finding the top 10 correlation values within dataset

我对我的数据分析有疑问。具体来说,我计算了大约 100 个相关性,并希望从这 100 个计算出的相关性中查看前 10 个相关值。不幸的是,我现在有点卡住了,无法继续前进。你能帮我如何自动输出这前10个相关值而不用手动一一检查吗?

相关值是这样计算的:

  my_correlation_1 <- function(ticker_subset, data) {
  cor(subset(data, TickerSymbol == ticker_subset, c(Sales, Stockprice_quarterly)))
}

mycor1 <- lapply(unique(dat$TickerSymbol), my_correlation_1, data = dat)
names(mycor1) <- unique(dat$TickerSymbol)

相关性计算提供如下结果:

# $AMD
#                           Sales Stockprice_quarterly
# Sales                 1.0000000           -0.2261417
# Stockprice_quarterly -0.2261417            1.0000000
# 
# $AAPL
#                          Sales Stockprice_quarterly
# Sales                1.0000000            0.6531391
# Stockprice_quarterly 0.6531391            1.0000000
# 
# $EBAY
#                          Sales Stockprice_quarterly
# Sales                1.0000000            0.2032839
# Stockprice_quarterly 0.2032839            1.0000000

非常感谢!

我将使用我们拥有的数据进行演示:mtcars

allcors <- lapply(unique(mtcars$cyl), function(z) cor(subset(mtcars, cyl == z, select = c(mpg, disp))))
allcors
# [[1]]
#        mpg  disp
# mpg  1.000 0.103
# disp 0.103 1.000
# [[2]]
#         mpg   disp
# mpg   1.000 -0.805
# disp -0.805  1.000
# [[3]]
#        mpg  disp
# mpg   1.00 -0.52
# disp -0.52  1.00

实际上,我们只需要其中每一个的一个非对角线值。由此,我们可以 rank 值并从那里移动。

sapply(allcors, function(z) z[2,1])
# [1]  0.103 -0.805 -0.520
rank(sapply(allcors, function(z) z[2,1]))
# [1] 3 1 2

表示第二个值是该组中排名最低的值。这是使用真实值;如果你想要绝对值的排名,使用 abs(.):

abs(sapply(allcors, function(z) z[2,1]))
# [1] 0.103 0.805 0.520
rank(abs(sapply(allcors, function(z) z[2,1])))
# [1] 1 3 2

从这里开始,如果您想要这 3 个中的前 2 个(这将是您 n 的前 10 个),那么我们可以使用 which:

which(allranks <= 2)
# [1] 1 3

意思是原来类别的第一和第三(你的TickerSymbol)排名最低。

并将其与原始类别联系起来,

unique(mtcars$cyl)[ which(allranks <= 2) ]
# [1] 6 8

(在某种意义上有最不相关。使用-rank(.)表示最相关。)


备选方案,从头开始使用数据而不是使用 lapply:

dplyr

library(dplyr)
mtcars %>%
  group_by(cyl) %>%
  summarize(corr = cor(cbind(mpg, disp))[2,1]) %>%
  slice_max(abs(corr), n=2)
# # A tibble: 2 x 2
#     cyl   corr
#   <dbl>  <dbl>
# 1     4 -0.805
# 2     8 -0.520

data.table

library(data.table)
as.data.table(mtcars)[, .(corr = cor(cbind(mpg, disp))[2,1]), by = cyl
  ][ rank(-abs(corr)) <= 2, ]
#      cyl   corr
#    <num>  <num>
# 1:     4 -0.805
# 2:     8 -0.520

基础 R

do.call(rbind,
  by(mtcars, mtcars["cyl"],
     FUN = function(z) data.frame(cyl = z$cyl[1], corr = cor(z$mpg, z$disp))
  )
)
#   cyl   corr
# 4   4 -0.805
# 6   6  0.103
# 8   8 -0.520

(然后您可以像其他人一样 sort/filter)。