R中大表的相关矩阵问题
我有一个如下的数据表R中大表的相关矩阵问题,r,plot,correlation,R,Plot,Correlation,我有一个如下的数据表 data table1: Cty LR1998 LR1999....LR2018 SM1998 SM1999 ..... SM2018 1 0.1 2.5 .... 5.2 14.52 58.62 ..... 69.2 7 0 50.2 ... 10.6 25.5 80.2 ..... 80.5 . . 我需要使用该时间段的LR和SM变量,找出1998年至2018年期间每个“Cty”的相关性
data table1:
Cty LR1998 LR1999....LR2018 SM1998 SM1999 ..... SM2018
1 0.1 2.5 .... 5.2 14.52 58.62 ..... 69.2
7 0 50.2 ... 10.6 25.5 80.2 ..... 80.5
.
.
我需要使用该时间段的LR和SM变量,找出1998年至2018年期间每个“Cty”的相关性(pearson)
我还想创建一个很好的相关图以及
有人能指导我如何使用R执行此操作吗?我知道如何使用“cor”函数,但不知道如何将其用于大型数据表
Example Output:
Cty Cor p-value
1 0.16 0.125
7 0.32 <0.05
示例输出:
Cty Cor p值
1 0.16 0.125
7 0.32对于相关图,您可以尝试以下方法:转置数据帧并使用“pairs”函数
配对(t(表1[-1]))为了获得国家间的相关性,它可能有助于重塑数据。虽然有一个基本的重塑
函数,但我总是发现它令人困惑,所以我经常使用tidyr
(或data.table
)来重塑操作
首先,一些数据:
set.seed(2)
n <- 6
x <- cbind.data.frame(
CTY = LETTERS[seq_len(n)],
sapply(paste0("LR", 2000:2006), function(ign) runif(n)),
stringsAsFactors=FALSE
)
(我现在删除的聚集
/扩散
方法之间的最大区别在于,这仍然是一个矩阵
,如果需要,可以使用as.data.frame
进行简单转换。这里不需要它。)
现在,这种关联相当直接
cor(y)
# A B C D E F
# A 1.000 -0.435 -0.1443 -0.2010 0.736 -0.471
# B -0.435 1.000 -0.3825 -0.3493 -0.145 0.279
# C -0.144 -0.382 1.0000 0.0885 -0.426 0.447
# D -0.201 -0.349 0.0885 1.0000 -0.523 -0.128
# E 0.736 -0.145 -0.4261 -0.5232 1.000 -0.121
# F -0.471 0.279 0.4467 -0.1279 -0.121 1.000
对于这种格式的数据,适应cor.test
的使用需要更多的工作。为此,我将使用更多的tidyverse
:
# library(purrr)
crossing(a=x$CTY, b=x$CTY) %>%
rowwise() %>%
do(bind_cols(.,
purrr::map2_dfc(.$a, .$b,
~ as.data.frame(cor.test(y[,.x], y[,.y])[c("estimate", "p.value")]))
)) %>%
ungroup()
# # A tibble: 36 x 4
# a b estimate p.value
# * <chr> <chr> <dbl> <dbl>
# 1 A A 1 0
# 2 A B -0.435 0.329
# 3 A C -0.144 0.757
# 4 A D -0.201 0.666
# 5 A E 0.736 0.0591
# 6 A F -0.471 0.286
# 7 B A -0.435 0.329
# 8 B B 1 0
# 9 B C -0.382 0.397
# 10 B D -0.349 0.443
# # ... with 26 more rows
您想要Cty之间的相关性是正确的吗?i、 e.行之间的相关性?我想要1998年至2018年期间LR和SM变量之间每行的相关性。我想我需要每个Cty的相关性。那个输出毫无意义。第一行是国家1与谁的关联?输出是一个示例,但值不正确。输出表Cty 1的相关性应与数据表1第一行从LR1998到LR2018的数据以及SM1998到SM 2018的数据相关。我知道这些值本身是占位符。我的观点是,你不能只与一个群体有关联。它可能需要包括Cty1
和Cty2
,如我下面的回答所示。除非我完全误解了这个问题。您是否真的尝试将数据.frame
转换为一个字符
列,其余数字
?转换可以工作,但没有数字。相反,我建议t(表1[-1])
删除第一个(char)列,假设所有其他列都是数字,或者t(表1[c(…)])
其中…
是要保留的列号或名称的向量。是的,你是对的。我假设它只是一个标识符,不需要包含在相关计算中。我将编辑答案。谢谢
# library(purrr)
crossing(a=x$CTY, b=x$CTY) %>%
rowwise() %>%
do(bind_cols(.,
purrr::map2_dfc(.$a, .$b,
~ as.data.frame(cor.test(y[,.x], y[,.y])[c("estimate", "p.value")]))
)) %>%
ungroup()
# # A tibble: 36 x 4
# a b estimate p.value
# * <chr> <chr> <dbl> <dbl>
# 1 A A 1 0
# 2 A B -0.435 0.329
# 3 A C -0.144 0.757
# 4 A D -0.201 0.666
# 5 A E 0.736 0.0591
# 6 A F -0.471 0.286
# 7 B A -0.435 0.329
# 8 B B 1 0
# 9 B C -0.382 0.397
# 10 B D -0.349 0.443
# # ... with 26 more rows
crossing(a=x$CTY, b=x$CTY) %>%
transmute(a1 = pmin(a,b), b1 = pmax(a,b)) %>%
distinct() %>%
rowwise() %>%
do(bind_cols(.,
purrr::map2_dfc(.$a1, .$b1,
~ as.data.frame(cor.test(y[,.x], y[,.y])[c("estimate", "p.value")]))
)) %>%
ungroup()
# # A tibble: 21 x 4 ...