【问题标题】:Saving index values and results in a vector, list or data frame in triple for loop in R在R中的三重for循环中将索引值和结果保存在向量、列表或数据框中
【发布时间】:2017-06-06 10:56:06
【问题描述】:

我在 R 中有以下三重 for 循环:

res <- data.frame()

for (i in c(1,3,5,7,9,11,13)) {
  for (k in c(3,5,7,9,11,13)) {
    for (j in 1:41) {

      tmp <- chisq.test(matrix(c(counts[j,i],counts[j,(i+1)],counts[j,k],counts[j,(k+1)]),nrow=2,ncol=2,byrow=TRUE))

      res<-c(res,c(tmp$p.value)) 
}}} 

counts 是一个 14x41 的数据框,其中包含基因型计数值(诸如 600、400、240 之类的数字。您可以使用随机值生成自己的数字,以便在您的计算机中重现)。

我想将 chisq.test 的结果 p.value 保存在一个向量中(res,来自“results”)。目前,输出如下:

这没关系,但现在我还希望它有另外三列指示 j、i 和 k 值,以便稍后我可以跟踪每个 p 值的来源。因此,所需的输出将是:

res
(p value 1) j1 i1 k1
(p value 2) j2 i2 k2
...

所以,我修改了循环,将 j,i,k 添加到最后一行,如下所示:

res <- data.frame()

for (i in c(1,3,5,7,9,11,13)) {
  for (k in c(3,5,7,9,11,13)) {
    for (j in 1:41) {

      tmp <- chisq.test(matrix(c(counts[j,i],counts[j,(i+1)],counts[j,k],counts[j,(k+1)]),nrow=2,ncol=2,byrow=TRUE))

      res<-c(res,c(tmp$p.value,j,i,k)) 
}}} 

它会产生以下结果(我不喜欢):

有什么想法吗?谢谢!

【问题讨论】:

  • 什么是counts?您能否提供一个可重现的示例来运行您提供的代码?
  • 问题上已经解释过了。 “counts 是一个 14x41 的数据框,带有基因型计数值(数字如 600、400、240.. 您可以使用随机值生成自己的数字,以便在您的计算机中重现)。”

标签: r for-loop


【解决方案1】:

您可以向数据框添加新行,而不是将结果连接在一起。

可能是这样的:

res <- NULL

for (i in c(1,3,5,7,9,11,13)) {
  for (k in c(3,5,7,9,11,13)) {
    for (j in 1:41) {

      tmp <- chisq.test(matrix(c(counts[j,i],counts[j,(i+1)],counts[j,k],counts[j,(k+1)]),nrow=2,ncol=2,byrow=TRUE))

      res<-rbind(res, data.frame(p.value = tmp$p.value,
                                 i = i,
                                 j = j,
                                 k = k, 
                                 stringsAsFactors = FALSE)) 
    }}} 


数据:
counts <- matrix(data = sample(1:1000, 574, replace = FALSE),
             nrow = 41, ncol = 14)

【讨论】:

  • 太棒了,你做到了!非常感谢:D
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多