R数据表中各组之间的相关性

R数据表中各组之间的相关性,r,data.table,correlation,R,Data.table,Correlation,如果这些值按组存储在data.table的单个列中(而不是将data.table转换为矩阵),是否有一种优雅地计算值之间相关性的方法 我正在寻找更多类似于: dt[, cor(value, value), by="group"] 但这并没有给我我想要的相关性 对于一个结果正确的矩阵,这里有同样的问题 set.seed(1) # reproducibility m <- matrix(rnorm(8), ncol=2) dimnames(m) <- list(

如果这些值按组存储在data.table的单个列中(而不是将data.table转换为矩阵),是否有一种优雅地计算值之间相关性的方法

我正在寻找更多类似于:

dt[, cor(value, value), by="group"]
但这并没有给我我想要的相关性

对于一个结果正确的矩阵,这里有同样的问题

set.seed(1)             # reproducibility
m <- matrix(rnorm(8), ncol=2)
dimnames(m) <- list(id=1:4, group=letters[1:2])

#        group
# id           a          b
#   1 -0.6264538  0.3295078
#   2  0.1836433 -0.8204684
#   3 -0.8356286  0.4874291
#   4  1.5952808  0.7383247

cor(m)                  # correlations between groups

#           a         b
# a 1.0000000 0.1556371
# b 0.1556371 1.0000000
set.seed(1)#再现性

对于
数据表
,没有简单的方法可以做到这一点。您提供的第一种方式:

cor(dt["a"]$value, dt["b"]$value)
这可能是最简单的

另一种方法是对
数据进行
整形。表格
长格式改为
宽格式:

> dtw <- reshape(dt, timevar="group", idvar="id", direction="wide")
> dtw
   id    value.a    value.b
1:  1 -0.6264538  0.3295078
2:  2  0.1836433 -0.8204684
3:  3 -0.8356286  0.4874291
4:  4  1.5952808  0.7383247
> cor(dtw[,list(value.a, value.b)])
          value.a   value.b
value.a 1.0000000 0.1556371
value.b 0.1556371 1.0000000

我不知道如何直接将其转换为矩阵形式,但我发现此解决方案非常有用:

dt[, {x = value; dt[, cor(x, value), by = group]}, by=group]

   group group        V1
1:     a     a 1.0000000
2:     a     b 0.1556371
3:     b     a 0.1556371
4:     b     b 1.0000000
因为您从一个熔化的数据集开始,最终得到了相关的熔化表示

使用这种形式,您还可以选择只计算某些对,尤其是计算两个非对角线是浪费时间。例如:

 dt[, {x = value; g = group; dt[group <= g, list(cor(x, value)), by = group]}, by=group]
   group group        V1
1:     a     a 1.0000000
2:     b     a 0.1556371
3:     b     b 1.0000000

我找到了一个更简单的替代方法。实际上,您的
dt[,cor(value,value),by=“group”]
方法非常接近。您实际上需要的是首先在日期上进行笛卡尔连接,然后分组。 即

这样做的好处是它可以将系列连接在一起(而不是假设它们的长度相同)。然后,您可以将其转换为矩阵形式,或者将其保持原样,以在ggplot等中绘制为热图

完整示例

setkey(dt, id)
c <- dt[dt, allow.cartesian=T][, list(Cor = cor(value, value.1)), by = list(group, group.1)]
c

   group group.1       Cor
1:     a       a 1.0000000
2:     b       a 0.1556371
3:     a       b 0.1556371
4:     b       b 1.0000000

dcast(c, group~group.1, value.var = "Cor")

  group         a         b
1     a 1.0000000 0.1556371
2     b 0.1556371 1.0000000
setkey(dt,id)

c你知道
dcast.data.table
吗?我想我以前见过它,但现在我深入挖掘,发现我被一个较旧版本的
数据卡住了。table
1.8.11
之前,
重塑
不适用于
数据。table
s,因为没有实现
dcast.data.table
melt.data.table
,所以您必须转换到
data.frame
并返回。@ScottRitchie,不是真的。我认为你混淆了Hadley软件包中的基函数
Reformate
是一个基本函数,在所有版本的
data.table
上都能正常工作<代码>重塑
重塑2
也是具有函数melt/cast的软件包
data.table>=1.9.0
版本实施
melt
dcast
方法并导入
reforme2
@BramVisser,是,右和右
dcast.data.table
利用了所有data.table的内部结构,以及其他用C编写的基本功能。如果遇到任何问题,请告诉我们。请记住,从现在起,您必须完整地拼写出
dcast.data.table
,而不仅仅是
dcast
。。以后会修好的。如果只使用
dcast
它将使用
restrape2的dcast
,这比
dcast.data.table
慢得多。
dt[, {x = value; dt[, cor(x, value), by = group]}, by=group]

   group group        V1
1:     a     a 1.0000000
2:     a     b 0.1556371
3:     b     a 0.1556371
4:     b     b 1.0000000
 dt[, {x = value; g = group; dt[group <= g, list(cor(x, value)), by = group]}, by=group]
   group group        V1
1:     a     a 1.0000000
2:     b     a 0.1556371
3:     b     b 1.0000000
library(data.table)
set.seed(1)             # reproducibility
dt1 <- data.table(id=1:4, group=rep(letters[1:2], c(4,4)), value=rnorm(8))
dt2 <- data.table(id=1:4, group=rep(letters[3:4], c(4,4)), value=rnorm(8))
setkey(dt1, group)
setkey(dt2, group)

dt1[, {x = value; g = group; dt2[, list(cor(x, value)), by = group]}, by=group]

   group group          V1
1:     a     c -0.39499814
2:     a     d  0.74234458
3:     b     c  0.96088312
4:     b     d  0.08016723
dcast.data.table(dt[, {x = value; g1=group; dt[, list(g1, g2=group, c =cor(x, value)), by = group]}, by=group], g1~g2, value.var = "c")

   g1         a         b
1:  a 1.0000000 0.1556371
2:  b 0.1556371 1.0000000
dt[dt, allow.cartesian=T][, cor(value, value), by=list(group, group.1)]
setkey(dt, id)
c <- dt[dt, allow.cartesian=T][, list(Cor = cor(value, value.1)), by = list(group, group.1)]
c

   group group.1       Cor
1:     a       a 1.0000000
2:     b       a 0.1556371
3:     a       b 0.1556371
4:     b       b 1.0000000

dcast(c, group~group.1, value.var = "Cor")

  group         a         b
1     a 1.0000000 0.1556371
2     b 0.1556371 1.0000000