我试图在R中编写一个循环,循环通过3个不同的物种来计算两个连续变量(Redness和VarNormAbund)之间的相关性。
我的循环正在运行,但是3个物种中的每一个的输出是相同的,这让我觉得循环在第一个物种上卡住了。
cor.test.redness<-lapply(unique(test$Species), function(x){cor.test(test$Redness, test$VarNormAbund)})
数据结构: 物种在第一列。我希望循环提取每个物种并在Redness和VarNormAbund之间进行测试。 每个类别都应该有一个输出。所以列表中有3个输出。
我错过了一个告诉循环做每个物种的论点吗?
另外,有没有办法让输出成为data.frame
而不是列表?
任何建议都会受到赞赏,我对循环没有多少经验。
Species<-c("A","B","C","A","B","C","A","B","C")
Redness<-c(1,1,1,2,2,2,3,3,3)
VarNormAbund<-c(1.6, 0,0,12.5,0,1,1.37, 2.74, 0)
test<-data.frame(Species, Redness, VarNormAbund)
欢呼声。
答案 0 :(得分:3)
你得到所有这三个物种的相同结果的原因是,即使你循环通过独特的物种,你没有对数据进行子集,所以你的测试仍然在整个数据集上,一个简单的解决方案是:
cor.test.redness<-lapply(unique(test$Species), function(x){
cor.test(test[test$Species == x, ]$Redness,
test[test$Species == x, ]$VarNormAbund)})
如果希望输出为数据帧,可以从相关性测试结果中提取系数并将它们放入数据框中,然后rbind
结果。因此,例如,如果您想要p.value
和correlation coefficient
的数据框,则可以执行以下操作:
cor.test.redness<-do.call(rbind, lapply(unique(test$Species), function(x){
cor.result <- cor.test(test[test$Species == x, ]$Redness,
test[test$Species == x, ]$VarNormAbund);
data.frame(p.Value = cor.result$p.value, cor = cor.result$estimate)
}))
cor.test.redness
# p.Value cor
# cor 0.9884892 -0.01808019
# cor1 0.3333333 0.86602540
# cor2 1.0000000 0.00000000
您还可以添加列以在结果数据框中指定种类。但我相信你可以把这部分弄清楚,所以留给你。
注意:这种类型的子集可能会很慢,如果您的数据集很大且性能有问题,您可以尝试使用data.table
或{{1进行测试快速组合功能。
答案 1 :(得分:0)
我们可以使用group by operations轻松完成此任务。
> final_data
ID A B C
1 1 1 1 1
2 2 4 2 2
3 3 2 5 3
4 4 2 5 4
5 5 4 5 6
或者如果我们需要提取pvalue,只需执行
library(data.table)
lst <- setDT(test)[, list(list(cor.test(Redness, VarNormAbund))), by = Species]$V1