R中dplyr/tidyr如何在单个命令内多次调用summarize计算物种协方差
报错原因
summarise() 执行聚合操作后,仅会保留当前的分组列与本次计算生成的新列。你在链式调用中第一次执行summarise后,输出的结果只有month、site、covar.species1三列,原始数据中的abundance、species、abundance.covar等列已经被移除,后续调用summarise时自然找不到所需变量。
解决方案
最小修改方案
将四个物种的协方差计算全部放在同一次summarise调用中即可正常运行:
agg.cov <- df.long%>% group_by(month,site)%>% dplyr::summarise( covar.species1 = cor(abundance[species=="sp1"],abundance.covar[species.covar=="sp2.3.4"]), covar.species2 = cor(abundance[species=="sp2"],abundance.covar[species.covar=="sp3.4.1"]), covar.species3 = cor(abundance[species=="sp3"],abundance.covar[species.covar=="sp1.2.4"]), covar.species4 = cor(abundance[species=="sp4"],abundance.covar[species.covar=="sp1.2.3"]) )%>% as.data.frame()
优化方案(推荐)
你无需提前手动构造求和列、也不需要将数据转成长格式,直接基于原始宽表计算逻辑更简洁、执行效率更高:
agg.cov <- df %>% group_by(month, site) %>% dplyr::summarise( covar.species1 = cor(sp1, sp2 + sp3 + sp4), covar.species2 = cor(sp2, sp1 + sp3 + sp4), covar.species3 = cor(sp3, sp1 + sp2 + sp4), covar.species4 = cor(sp4, sp1 + sp2 + sp3) ) %>% as.data.frame()
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

