如果我有以下数据表:
set.seed(1)
TDT <- data.table(Group = c(rep("A",40),rep("B",60)),
Id = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)),
Time = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5),
norm = round(runif(100)/10,2),
x1 = sample(100,100),
x2 = round(rnorm(100,0.75,0.3),2),
x3 = round(rnorm(100,0.75,0.3),2),
x4 = round(rnorm(100,0.75,0.3),2),
x5 = round(rnorm(100,0.75,0.3),2))
如何按时间计算 x1、x2、x3、x4 和 x5 之间的相关性?
这个:
TDT[,x:= list(cor(TDT[,5:9])), by = Time]
不起作用。
怎么能在
datatable
?
最佳答案
你的尝试是如此接近!你错过的只是一个额外的 list()
.
这有效:
TDT[,x:= list(list(cor(TDT[,5:9]))), by = Time]
和
TDT$x
返回:[[1]]
x1 x2 x3 x4 x5
x1 1.00000000 0.72185099 0.07368766 -0.7031890 -0.36895449
x2 0.72185099 1.00000000 0.68058833 -0.7393130 0.05066973
x3 0.07368766 0.68058833 1.00000000 -0.5021462 0.10645894
x4 -0.70318896 -0.73931299 -0.50214616 1.0000000 0.11671020
x5 -0.36895449 0.05066973 0.10645894 0.1167102 1.00000000
[[2]]
x1 x2 x3 x4 x5
x1 1.0000000 -0.1011948 -0.85191422 -0.15571603 0.4855237
x2 -0.1011948 1.0000000 0.56691559 -0.44002621 -0.6699172
x3 -0.8519142 0.5669156 1.00000000 0.02189754 -0.6168013
x4 -0.1557160 -0.4400262 0.02189754 1.00000000 0.2236542
x5 0.4855237 -0.6699172 -0.61680132 0.22365419 1.0000000
[...]
额外的
list()
需要,因为方式 data.table
解析 DT[1,2]
的第二个元素句法。这已在 stackoverflow 的其他地方进行了深入讨论, most excellent answer我邀请你阅读。作为旁注,似乎最好替换对
list()
的最外层调用。与 .()
以澄清意图。我也喜欢明确地挑出引用 .SD
的列和 .SDcols
.使用相同的结果,您可以将代码重写为:TDT[, x := .(list(cor(.SD))), by = Time, .SDcols = 5:9]
关于r - 数据表中的相关矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42611836/