【发布时间】:2014-03-20 04:02:59
【问题描述】:
我仍在学习使用 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 样方组的协方差之和。如果我只有给定 Zone x 样方组合的物种列表,那么我可以使用 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'
我明白为什么,但我不知道如何解决这个问题。
我真正想要的是能够为每个区域 x 样方组合获得所有采样时间点上所有物种的协方差矩阵。然后,我需要从每个矩阵中计算所有物种对的协方差之和,这样我就可以得到每个 Zone x 样方组合的协方差之和。
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
您的
test不起作用,因为列的长度不同。它看起来也不像您在此处显示的TEST。另外,您的示例是否需要Time变量?最后,你想要的输出是什么样的?矩阵列表? -
抱歉,复制了错误的版本:我已编辑问题以更正它。是的,我需要 Time 变量,因为这是应该计算协方差的变量。我还对问题进行了编辑,以更具体地说明我在寻找什么。
-
好的,比如
TEST[,sum(upper.tri(cov(.SD))),by='Zone,quadrat',.SDcols=paste('Sp',1:3,sep='')]? -
这不起作用,尽管我认为它的方向是正确的:sum 函数似乎从 upper.tri 函数计算 TRUE 值的数量,而不是实际值。
-
OK,所以把上面的代码改成
diag = FALSE之后,我觉得可以了
标签: r data.table