微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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,1)/3)$class
       vars <- sum(diag(prop.table(table(trainingframe$locus,cls))))
       data.frame(j,vars)
      }))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。