【问题标题】:Tri-nested loop in RR中的三嵌套循环
【发布时间】:2019-09-09 20:02:51
【问题描述】:

目前,我正在编写一个在 R 中使用三嵌套循环的函数;但是,它似乎有一些奇怪的行为。我注意到以下问题:

1) 基因似乎没有在循环末尾附加到gene.out,我从gene.out 得到的列表是gene.use。

2) cond 只会重复(即 22_22、35_35 等)

据我所知,这些事情都不应该在第三个循环中发生。这是一些奇怪的 R 循环行为还是编码错误?

这里是有问题的代码:

for (gene in genes.use){

    for (i in groups){
      cat(paste("i: ",i, "\n"))

      i_cells = rownames(SerautObj@meta.data[SerautObj@meta.data[[group.by]] == i,])
      i_vector = SerautObj@assays[[assay]]@data[gene, i_cells]

      for(j in groups){
        cat(paste("j: ",j, "\n"))

        j_cells = rownames(SerautObj@meta.data[SerautObj@meta.data[[group.by]] == j,])
        j_vector = SerautObj@assays[[assay]]@data[gene, j_cells]


        cond = paste(i, j, sep = "_")
        cat(paste(gene, cond, sep = "\n"))

        #preform t-test
        t_out = t.test(i_vector, j_vector)

        #constuct outs

        condition.out <- c(condition.out, cond)



        stat.out <- c(stat.out, t_out[["statistic"]])
        p_val.out <- c(p_val.out, t_out[["p.value"]])
        gene.out <- c(gene.out, gene)
        }
    }
}

编辑:

忘了包括,当我在 i 循环中执行 print(paste("i: ", i) 和 print(paste("j: ", j)) 时,我得到:

我:组1
我:组2
我:组3
j: 组1
j: 组2
j: 组 3

来自https://satijalab.org/seurat/v3.1/pbmc3k_tutorial.html的玩具组数据:

SerautObj@meta.data
structure(list(orig.ident = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), .Label = "pbmc3k", class = "factor"), nCount_RNA = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), nFeature_RNA = c(0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L), group = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 
5)), row.names = c("AAACATACAACCAC", "AAACATTGAGCTAC", "AAACATTGATCAGC", 
"AAACCGTGCTTCCG", "AAACCGTGTATGCG", "AAACGCACTGGTAC", "AAACGCTGACCAGT", 
"AAACGCTGGTTCTT", "AAACGCTGTAGCCA", "AAACGCTGTTTCTG"), class = "data.frame")

SerautObj@assays[[assay]]@data

    new("dgCMatrix", i = integer(0), p = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L), Dim = c(10L, 10L), Dimnames = list(c("AL627309.1", 
"AP006222.2", "RP11-206L10.2", "RP11-206L10.9", "LINC00115", 
"NOC2L", "KLHL17", "PLEKHN1", "RP11-54O7.17", "HES4"), c("AAACATACAACCAC", 
"AAACATTGAGCTAC", "AAACATTGATCAGC", "AAACCGTGCTTCCG", "AAACCGTGTATGCG", 
"AAACGCACTGGTAC", "AAACGCTGACCAGT", "AAACGCTGGTTCTT", "AAACGCTGTAGCCA", 
"AAACGCTGTTTCTG")), x = numeric(0), factors = list())

genes.use = c("PLEKHN1", "HES4", "NOC2L")
groups = Map(c, unique(SerautObj@meta.data$groups))

感谢阅读!

【问题讨论】:

  • 您能否通过给我们一个最小的数据框来使您的示例可重现?将数据框剥离为几条记录后,您可以将dput(dataframe_name) 的输出复制到您的代码块中,我们将能够重新创建它。
  • i, j 的迭代通常可以简化为一组矢量化操作
  • 我对 r 还不够熟悉,还不知道我应该为此使用什么命令,我更喜欢循环。你有什么推荐的地方吗?
  • @Connorr.0 - 如果您有兴趣,请查看 R 中的 apply 系列函数(apply、sapply、lapply、mapply)。函数式编程也是一个普遍的话题。

标签: r bioinformatics seurat


【解决方案1】:

原来问题出在:

Map(c, unique(SerautObj@meta.data$groups))

然后我尝试了:

as.list(unique(SerautObj[["time"]]))

这有同样的问题,但已解决:

unlist(as.list(unique(SerautObj[["time"]])))

列表上的 for 循环行为似乎很奇怪,您需要转到原子类型向量,否则最终可能会出现重复项。我猜有一些奇怪的引用正在发生,或者列表上有循环。

【讨论】:

  • 如果可行,请接受作为解决方案 - 勾选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2019-07-13
  • 2016-05-28
  • 2014-03-25
相关资源
最近更新 更多