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)。
我对我的数据分析有疑问。具体来说,我计算了大约 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)。