如何将长嵌套for循环的结果匹配并存储到R中数据框中的空列中

时间:2017-05-24 01:07:51

标签: r loops dataframe p-value

我试图将p值从长嵌套for循环存储到数据框中的空列。我已经尝试查找靠近我的代码的示例,但我觉得我的代码很长(甚至可能不正确),可以应用于其他for循环的相同内容不能应用于矿。

我尝试做的事情的概述是我试图通过找到p值来比较观察到的成对鸟类与特定年份所有可能成对鸟类的相关性。要做到这一点,我正在编写一个for循环,我从一个巨大的数据集中选择了一系列年份,然后我将一堆函数应用于那些我试图缩小范围的年份观察对的数据,然后我添加一个相关性列,并从另一个数据集中转移这些对的相关性值。然后我在其中应用另一个for循环函数,以便在该给定年份中创建具有所有可能的配对鸟的数据框,并且还添加和传送对的相关值列。从每年的这两个数据对和相关性数据框中,我想应用wilcox测试来找到每个给定年份的p值。我想将这些p值转换为我用年份列和p值列创建的单独数据框。

这是我的(疯狂的)代码:

`year <- c(2000:2013)
 pvalue <- c(NA)
 results <- data.frame(year, pvalue)
 for(j in c(2000:2013)) {
  allbr_demo_noEPP_year <- subset(allbr_demo_noEPP, Year == j)
  allbr_demo_noEPP_year_geno_obs <-  allbr_demo_noEPP_year[allbr_demo_noEPP_year$Pairs %in% c(genome$pair1,genome$pair2),]
  allbr_demo_noEPP_year_geno_obs$relatedness <- laply(allbr_demo_noEPP_year_geno_obs$Pairs, function(x) genome[genome$pair1==x|genome$pair2==x,'PI_HAT'])
  allbr_demo_noEPP_year_geno <- allbr_demo_noEPP_year[c(allbr_demo_noEPP_year$MB_USFWS,allbr_demo_noEPP_year$FB_USFWS) %in% genotyped$V2,]
  breeder_list_males <- allbr_demo_noEPP_year_geno_obs[,8]
  breeder_list_females <- allbr_demo_noEPP_year_geno_obs[,10]
  unq_breeder_list_males <- unique(breeder_list_males)
  unq_breeder_list_females <- unique(breeder_list_females)
  all_poss_combo <-list()
  for(i in unq_breeder_list_males){
   print(i)
   all_poss_combo[[i]]<-paste0(i, ",", unq_breeder_list_females)}
   lapply(X = all_poss_combo, FUN= function(x) length(unique(x)))
   all_poss_df<-unlist(all_poss_combo, use.names = F)
   all_poss_df <- data.frame("combo"=all_poss_df, "M"=NA, "F"=NA)
   all_poss_df$M <- substr(all_poss_df$combo, start = 1, stop = 10)
   all_poss_df$F <- substr(all_poss_df$combo, start = 12, stop = 22)
   all_poss_df_geno <- all_poss_df[all_poss_df$combo %in% c(genome$pair1,genome$pair2),]
   all_poss_df_geno$relatedness <- laply(all_poss_df_geno$combo, function(x) genome[genome$pair1==x|genome$pair2==x,'PI_HAT'])
   wilcox.test(allbr_demo_noEPP_year_geno_obs$relatedness, all_poss_df_geno$relatedness, alternative='greater')}`

说实话,我甚至不确定这个for循环是否有效(对我来说似乎相当复杂,但我是初学者),但我被告知为这种情况做一个for循环应该有效。我知道有可能更容易或更快的方式来做我想做的事情,我也欢迎,但我也想看看我如何解决这个问题循环所以它会工作以及我如何能够存储它的结果进入数据框架。

非常感谢您给予的任何帮助!

1 个答案:

答案 0 :(得分:1)

如果您只是想保存p值:

str(wilcox.test(rnorm(10), rnorm(10, 2))) # example from running ?Wilcox.test
wilcox.test(rnorm(10), rnorm(10, 2))$p.value # 

因此,使用您的数据集,可能将其放在for循环的底部:

pvalue[j] <- wilcox.test(allbr_demo_noEPP_year_geno_obs$relatedness, 
                         all_poss_df_geno$relatedness, alternative='greater')$p.value