我仍在学习使用data.table(来自data.table包),甚至在网上寻找帮助和帮助文件之后,我仍然在努力做我想做的事情。 我有一个超过60列的大型数据表(前三个对应于因子,其余对应于响应变量,在这种情况下是不同的物种)和几行对应于不同的处理水平和物种丰度。一个非常小的版本看起来像这样:
> TEST<-data.table(Time=c("0","0","0","7","7","7","12"),
Zone=c("1","1","0","1","0","0","1"),
quadrat=c(1,2,3,1,2,3,1),
Sp1=c(0,4,29,9,1,2,10),
Sp2=c(20,17,11,15,32,15,10),
Sp3=c(1,0,1,1,1,1,0))
>setkey(TEST,Time)
> TEST
Time Zone quadrat Sp1 Sp2 Sp3
1: 0 1 1 0 20 1
2: 0 1 2 4 17 0
3: 0 0 3 29 11 1
4: 12 1 1 10 10 0
5: 7 1 1 9 15 1
6: 7 0 2 1 32 1
7: 7 0 3 2 15 1
我需要计算每个Zone x quadrat组的协方差之和。如果我只有给定的Zone x quadrat组合的物种列表,那么我可以使用cov()函数但使用cov()的方式与我在
中使用mean()或sum()的方式相同 Abundance = TEST[,lapply(.SD,mean),by="Zone,quadrat"]
不起作用,因为我收到以下错误消息:
Error in cov(value) : supply both 'x' and 'y' or a matrix-like 'x'
我理解为什么,但我无法弄清楚如何解决这个问题。
我真正想要的是,对于每个Zone x quadrat组合,能够获得所有采样时间点上所有物种的协方差矩阵。从每个矩阵开始,我需要计算所有物种对的协方差之和,这样我就可以得到每个Zone x quadrat组合的协方差和。
非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
在@Frank上面提供的帮助和我使用upper.tri
函数的其他搜索中,以下代码有效:
Cov= TEST[,sum(cov(.SD)[upper.tri(cov(.SD), diag = FALSE)]), by='Zone,quadrat', .SDcols=paste('Sp',1:3,sep='')]
建议的初始版本,其中upper.tri()
未出现在[]中,仅从协方差矩阵中提取逻辑值,并且diag = FALSE
允许在对矩阵的上三角形求和之前排除对角线值。就我而言,我并不关心它是上三角还是下三角,但我确信使用lower.tri()
同样可以正常工作。
我希望这可以帮助可能遇到类似问题的其他用户。