Трехвложенный цикл в R

В настоящее время я пишу функцию, которая использует тройной вложенный цикл в 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: ", i) в цикл i и печатаю (paste("j: ", j)), я получаю:

я: group1
я: group2
я: group3
J: group1
J: group2
J: group3

Данные набора игрушек с 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))

Спасибо за прочтение!

1 ответ

Решение

Оказалось, что проблема заключалась в следующем:

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

Затем я попробовал:

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

У этого была та же проблема, но она была исправлена:

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

Похоже, что существует странное поведение цикла для списков, и вам нужно перейти к вектору атомарного типа, иначе вы можете получить дубликаты. Я предполагаю, что происходит какая-то странная ссылка или что-то с циклами по спискам.

Другие вопросы по тегам