Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于多个类别上具有cor.test的循环_R_Loops_For Loop - Fatal编程技术网

对于多个类别上具有cor.test的循环

对于多个类别上具有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)}) 干杯。对于这三种物种,您得到相同结果的原因是,即使您循环遍历唯一的物种,您也没有对数据进行子

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