将递增累积循环的结果打印为 R 中的单个数据帧

Printing the results of an increasing cumulative loop as a single data frame in R

我已经 运行 对 R 中的主成分分析的结果进行了最小判别分析,并且我一直在根据可以使用的最小 PC 数量计算要使用的适当 PC 数量代表累积变异的某个阈值,return 最高重分类率,遵循之前一些研究中的方法。

我一直在使用循环计算各种累计 PC 数的重分类率,但希望将其打印为 data.frame 用于 RMarkdown 报告。这是我一直在使用的代码。

for (j in 1:21){
  vars<-sum(diag(prop.table(table(
    trainingframe$locus,
    lda(data.frame(trainingframe[-c(1)])[1:j],grouping=trainingframe$locus,CV=TRUE,prior = c(1,1,1)/3)$class))))
  print(data.frame(j,vars))
}

在这段代码中trainingframe是训练数据集,locus是lda感兴趣的分类变量。第一列未被选中,因为它是基因座。我无法提供原始数据,但这在包含许多变量的主要成分以及一些感兴趣的分类变量的任何数据集上都应该是可解释的。

这是我从脚本中得到的结果。

  j     vars
1 1 0.512605
  j      vars
1 2 0.5882353
  j      vars
1 3 0.7058824
  j      vars
1 4 0.6806723
  j      vars
1 5 0.6722689
  j      vars
1 6 0.6638655
  j      vars
1 7 0.6722689
  j      vars
1 8 0.6386555
  j      vars
1 9 0.6470588
   j      vars
1 10 0.6554622
   j      vars
1 11 0.6554622
   j      vars
1 12 0.7226891
   j      vars
1 13 0.7142857
   j      vars
1 14 0.6890756
   j      vars
1 15 0.6806723
   j      vars
1 16 0.6806723
   j      vars
1 17 0.6890756
   j      vars
1 18 0.6554622
   j      vars
1 19 0.6470588

但是,如您所见,打印结果为每个结果打印了多个独立的数据框,而不是一个包含所有分析结果的数据框。

我想要制作的是像下面这样的data.frame...

 j      vars
 1 0.5126050
 2 0.5882353
 3 0.7058824
 4 0.6806723
 5 0.6722689
 6 0.6638655
 7 0.6722689
 8 0.6386555
 9 0.6470588
10 0.6554622
11 0.6554622
12 0.7226891
13 0.7142857
14 0.6890756
15 0.6806723
16 0.6806723
17 0.6890756
18 0.6554622
19 0.6470588

我正在尝试找出一种方法来重写上述代码以生成此处显示的最后一个数据帧。

我们可以初始化数据集,然后 rbind 而不是 printing

d1 <- data.frame(j = integer(), vars = numeric())
for (j in 1:21){
  vars<-sum(diag(prop.table(table(
    trainingframe$locus,
    lda(data.frame(trainingframe[-c(1)])[1:j],
               grouping=trainingframe$locus,CV=TRUE,
              prior = c(1,1,1)/3)$class))))
 d1 <- rbind(d1, data.frame(j,vars))
}

或者另一种编写代码的方法是 lapply

out <- do.call(rbind, lapply(1:21, function(j) {
      cls <- lda(data.frame(trainingframe[-1])[seq_len(j)],
         grouping = trainingframe$locus, CV = TRUE,
          prior = c(1, 1, 1)/3)$class
       vars <- sum(diag(prop.table(table(trainingframe$locus, cls))))
       data.frame(j, vars)
      }))