Трехвложенный цикл в 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"]])))
Похоже, что существует странное поведение цикла для списков, и вам нужно перейти к вектору атомарного типа, иначе вы можете получить дубликаты. Я предполагаю, что происходит какая-то странная ссылка или что-то с циклами по спискам.