将索引值和结果保存在R中的三元组for循环中的向量,列表或数据框中

时间:2017-06-06 01:32:27

标签: r for-loop

我在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)) 
}}} 

其中count是14x41数据框,带有基因型计数值(数字如600,400,240 ..您可以使用随机值生成自己的数据,以便在计算机中重现这一点。)

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

enter image description here

哪个好,但是现在我还希望它还有三列表示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)) 
}}} 

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

enter image description here

有什么想法?谢谢!

1 个答案:

答案 0 :(得分: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)