对于许多类别的cor.test循环

时间:2016-07-03 23:23:39

标签: r loops for-loop

我试图在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)

欢呼声。

2 个答案:

答案 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.valuecorrelation 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