计算由第三个变量分组的两个变量之间的相关系数
Calculate Correlation Coefficient Between 2 Variables Grouped by a 3rd Variable
我有一个包含 3 列的 excel 电子表格。第一列是将数据组合在一起的图片的 ID,第二列和第三列是我试图为其查找相关系数的值。
例如:
ID Dat1 Dat2
130 4 4.3
130 7.5 5
130 6.6 6
180 5.6
180 5 8.7
180 7.1 5
在该示例中,数据按第 1 列中的值分组,然后它们在第 2 列和第 3 列中具有单独的数据。我不确定使用 excel 或 R 是否更容易找到每个分组的相关系数。
我已经尝试了 Excel 中的数据分析加载项,但它不适用于 3 列。
提前致谢!
真实数据有几十万行数据。这只是一个例子。
解决方案使用data.table
# install.packages("data.table")
library(data.table)
df <- data.table(df)
df[,cor(Dat1,Dat2),by="ID"]
你可以试试
library(dplyr)
df1 %>%
group_by(ID) %>%
summarise(Cor= cor(Dat1, Dat2, use= "na.or.complete"))
# ID Cor
#1 130 0.6407453
#2 180 -1.0000000
数据
df1 <- structure(list(ID = c(130L, 130L, 130L, 180L, 180L, 180L),
Dat1 = c(4,
7.5, 6.6, 5.6, 5, 7.1), Dat2 = c(4.3, 5, 6, NA, 8.7, 5)), .Names = c("ID",
"Dat1", "Dat2"), class = "data.frame", row.names = c(NA, -6L))
两个基本的 R 解决方案,使用@akrun 的数据:
with(df1, by(cbind(Dat1, Dat2), ID, cor, use = "complete"))
# INDICES: 130
# Dat1 Dat2
# Dat1 1.0000000 0.6407453
# Dat2 0.6407453 1.0000000
# -----------------------------------------------------------------------------------------------------------------------
# INDICES: 180
# Dat1 Dat2
# Dat1 1 -1
# Dat2 -1 1
lapply(split(df1, df1$ID), function(x) cor(x$Dat1, x$Dat2, use = "complete"))
# $`130`
# [1] 0.6407453
#
# $`180`
# [1] -1
我有一个包含 3 列的 excel 电子表格。第一列是将数据组合在一起的图片的 ID,第二列和第三列是我试图为其查找相关系数的值。
例如:
ID Dat1 Dat2
130 4 4.3
130 7.5 5
130 6.6 6
180 5.6
180 5 8.7
180 7.1 5
在该示例中,数据按第 1 列中的值分组,然后它们在第 2 列和第 3 列中具有单独的数据。我不确定使用 excel 或 R 是否更容易找到每个分组的相关系数。
我已经尝试了 Excel 中的数据分析加载项,但它不适用于 3 列。
提前致谢!
真实数据有几十万行数据。这只是一个例子。
解决方案使用data.table
# install.packages("data.table")
library(data.table)
df <- data.table(df)
df[,cor(Dat1,Dat2),by="ID"]
你可以试试
library(dplyr)
df1 %>%
group_by(ID) %>%
summarise(Cor= cor(Dat1, Dat2, use= "na.or.complete"))
# ID Cor
#1 130 0.6407453
#2 180 -1.0000000
数据
df1 <- structure(list(ID = c(130L, 130L, 130L, 180L, 180L, 180L),
Dat1 = c(4,
7.5, 6.6, 5.6, 5, 7.1), Dat2 = c(4.3, 5, 6, NA, 8.7, 5)), .Names = c("ID",
"Dat1", "Dat2"), class = "data.frame", row.names = c(NA, -6L))
两个基本的 R 解决方案,使用@akrun 的数据:
with(df1, by(cbind(Dat1, Dat2), ID, cor, use = "complete"))
# INDICES: 130
# Dat1 Dat2
# Dat1 1.0000000 0.6407453
# Dat2 0.6407453 1.0000000
# -----------------------------------------------------------------------------------------------------------------------
# INDICES: 180
# Dat1 Dat2
# Dat1 1 -1
# Dat2 -1 1
lapply(split(df1, df1$ID), function(x) cor(x$Dat1, x$Dat2, use = "complete"))
# $`130`
# [1] 0.6407453
#
# $`180`
# [1] -1