簡體   English   中英

R - 在數據集中查找前 10 個相關值

[英]R - finding the top 10 correlation values within dataset

我對我的數據分析有疑問。 具體來說,我計算了大約 100 個相關性,並希望從這 100 個計算出的相關性中查看前 10 個相關值。 不幸的是,我現在有點卡住了,無法繼續前進。 你能幫我 output 如何自動 output 這些前 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 個(這將是您的前 10 個n ),那么我們可以使用 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

(然后你可以像其他的一樣排序/過濾)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM