行相关
Correlation over rows
我有两个来自同一个人的数据集,我想计算每个人在这两个数据集上的相关性。
示例数据集:
dat1 <- read.table(header=TRUE, text="
ItemX1 ItemX2 ItemX3 ItemX4 ItemX5
5 1 2 1 5
3 1 3 3 4
2 1 3 1 3
4 2 5 5 3
5 1 4 1 2
")
dat2 <- read.table(header=TRUE, text="
ItemY1 ItemY2 ItemY3 ItemY4 ItemY5
4 2 1 1 4
4 3 1 2 5
1 5 3 2 2
5 2 4 4 1
5 1 5 2 1
")
有谁知道如何计算每个人的行向相关性而不是整个两个数据集的相关性?
谢谢!
一种可能的解决方案是使用 {purrr} 遍历两个 df 的行并计算 dat1
和 dat2
的每一行之间的相关性。
library(purrr)
dat1 <- read.table(header=TRUE, text="
ItemX1 ItemX2 ItemX3 ItemX4 ItemX5
5 1 2 1 5
3 1 3 3 4
2 1 3 1 3
4 2 5 5 3
5 1 4 1 2
")
dat2 <- read.table(header=TRUE, text="
ItemY1 ItemY2 ItemY3 ItemY4 ItemY5
4 2 1 1 4
4 3 1 2 5
1 5 3 2 2
5 2 4 4 1
5 1 5 2 1
")
n_person = nrow(dat1)
cormat <- purrr::map_df(.x = setNames(1:n_person, paste0("person_", 1:n_person)), .f = ~cor(t(dat1[.x,]), t(dat2[.x,])))
cormat
#> # A tibble: 1 x 5
#> person_1[,"1"] person_2[,"2"] person_3[,"3"] person_4[,"4"] person_5[,"5"]
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 0.917 0.289 -0.330 0.723 0.913
由 reprex 包 (v0.3.0) 创建于 2020-11-16
根据@Ravi提到的post,我们可以转置数据框,然后计算相关性。如果您想要一种不那么浪费的方法,另一个步骤是向量化 cor
函数。考虑这样的事情
tp <- function(x) unname(as.data.frame(t(x)))
Vectorize(cor, c("x", "y"))(tp(dat1), tp(dat2))
输出
[1] 0.9169725 0.2886751 -0.3296902 0.7234780 0.9132660
我有两个来自同一个人的数据集,我想计算每个人在这两个数据集上的相关性。
示例数据集:
dat1 <- read.table(header=TRUE, text="
ItemX1 ItemX2 ItemX3 ItemX4 ItemX5
5 1 2 1 5
3 1 3 3 4
2 1 3 1 3
4 2 5 5 3
5 1 4 1 2
")
dat2 <- read.table(header=TRUE, text="
ItemY1 ItemY2 ItemY3 ItemY4 ItemY5
4 2 1 1 4
4 3 1 2 5
1 5 3 2 2
5 2 4 4 1
5 1 5 2 1
")
有谁知道如何计算每个人的行向相关性而不是整个两个数据集的相关性?
谢谢!
一种可能的解决方案是使用 {purrr} 遍历两个 df 的行并计算 dat1
和 dat2
的每一行之间的相关性。
library(purrr)
dat1 <- read.table(header=TRUE, text="
ItemX1 ItemX2 ItemX3 ItemX4 ItemX5
5 1 2 1 5
3 1 3 3 4
2 1 3 1 3
4 2 5 5 3
5 1 4 1 2
")
dat2 <- read.table(header=TRUE, text="
ItemY1 ItemY2 ItemY3 ItemY4 ItemY5
4 2 1 1 4
4 3 1 2 5
1 5 3 2 2
5 2 4 4 1
5 1 5 2 1
")
n_person = nrow(dat1)
cormat <- purrr::map_df(.x = setNames(1:n_person, paste0("person_", 1:n_person)), .f = ~cor(t(dat1[.x,]), t(dat2[.x,])))
cormat
#> # A tibble: 1 x 5
#> person_1[,"1"] person_2[,"2"] person_3[,"3"] person_4[,"4"] person_5[,"5"]
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 0.917 0.289 -0.330 0.723 0.913
由 reprex 包 (v0.3.0) 创建于 2020-11-16
根据@Ravi提到的post,我们可以转置数据框,然后计算相关性。如果您想要一种不那么浪费的方法,另一个步骤是向量化 cor
函数。考虑这样的事情
tp <- function(x) unname(as.data.frame(t(x)))
Vectorize(cor, c("x", "y"))(tp(dat1), tp(dat2))
输出
[1] 0.9169725 0.2886751 -0.3296902 0.7234780 0.9132660