[英]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
:
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
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
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.