对于多个类别上具有cor.test的循环
我试图在R中写一个循环,循环3种不同的物种,以计算两个连续变量(红色和VarNormAbund)之间的相关性 我的循环正在运行,但3个物种的输出都是相同的,这让我觉得循环在第一个物种上卡住了对于多个类别上具有cor.test的循环,r,loops,for-loop,R,Loops,For Loop,我试图在R中写一个循环,循环3种不同的物种,以计算两个连续变量(红色和VarNormAbund)之间的相关性 我的循环正在运行,但3个物种的输出都是相同的,这让我觉得循环在第一个物种上卡住了 cor.test.redness<-lapply(unique(test$Species), function(x){cor.test(test$Redness, test$VarNormAbund)}) 干杯。对于这三种物种,您得到相同结果的原因是,即使您循环遍历唯一的物种,您也没有对数据进行子
cor.test.redness<-lapply(unique(test$Species), function(x){cor.test(test$Redness, test$VarNormAbund)})
干杯。对于这三种物种,您得到相同结果的原因是,即使您循环遍历唯一的物种,您也没有对数据进行子集,因此您的测试仍然在整个数据集上,一个简单的修复方法是:
cor.test.redness<-lapply(unique(test$Species), function(x){
cor.test(test[test$Species == x, ]$Redness,
test[test$Species == x, ]$VarNormAbund)})
还可以添加列以在结果数据框中指定物种。但我相信你能弄明白这一部分,所以就交给你吧
注意:这种类型的子集可能会很慢,如果您的数据集很大且性能有问题,您可以尝试使用
数据.table
或dplyr
的快速分组功能进行测试。我们可以使用分组操作轻松完成此操作
library(data.table)
lst <- setDT(test)[, list(list(cor.test(Redness, VarNormAbund))), by = Species]$V1
循环的
在哪里?我只看到lappy
@Parfait,我相信lappy
意味着列表元素上的循环。@gung-我理解幕后的lappy是一个循环(矢量化版本),但我和其他读者一样,可能会期待一个显式的for
循环。它甚至被贴上了这样的标签。@Parfait,没错。这确实让你期待更明确的东西。循环和数据帧转换都能完美地工作!谢谢你解释我在循环中遗漏了什么!谢谢@akrun的帮助!
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
library(data.table)
lst <- setDT(test)[, list(list(cor.test(Redness, VarNormAbund))), by = Species]$V1
setDT(test)[, list(pval = cor.test(Redness, VarNormAbund)$p.value), by = Species]
# Species pval
#1: A 0.9884892
#2: B 0.3333333
#3: C 1.0000000