将索引值和结果保存在向量、列表或数据帧中,以三重形式保存在R中的循环中

将索引值和结果保存在向量、列表或数据帧中,以三重形式保存在R中的循环中,r,for-loop,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))

我在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)) 
}}} 
因此,我修改了循环,将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)) 
}}} 
它产生了我不喜欢的以下结果:


有什么想法吗?谢谢大家!

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

也许是这样的:

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是一个14x41数据帧,其基因型计数值为600、400、240。。您可以使用随机值生成自己的值,以便在计算机中重现此值。太好了,你做到了!非常感谢:D
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)