R中的三嵌套循环
Tri-nested loop in R
目前,我正在编写一个在 R 中使用三嵌套循环的函数;但是,它似乎有一些奇怪的行为。我注意到以下问题:
1) 基因似乎没有在循环结束时附加到 gene.out,我从 gene.out 得到的列表是 gene.use。
2) cond ONLY 复制(即 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
i: 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))
感谢阅读!
原来问题出在:
Map(c, unique(SerautObj@meta.data$groups))
然后我尝试了:
as.list(unique(SerautObj[["time"]]))
这有同样的问题,但已解决:
unlist(as.list(unique(SerautObj[["time"]])))
列表上的 for 循环行为似乎很奇怪,您需要转到原子类型向量,否则可能会出现重复项。我猜发生了一些奇怪的引用或列表循环的事情。
目前,我正在编写一个在 R 中使用三嵌套循环的函数;但是,它似乎有一些奇怪的行为。我注意到以下问题:
1) 基因似乎没有在循环结束时附加到 gene.out,我从 gene.out 得到的列表是 gene.use。
2) cond ONLY 复制(即 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
i: 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))
感谢阅读!
原来问题出在:
Map(c, unique(SerautObj@meta.data$groups))
然后我尝试了:
as.list(unique(SerautObj[["time"]]))
这有同样的问题,但已解决:
unlist(as.list(unique(SerautObj[["time"]])))
列表上的 for 循环行为似乎很奇怪,您需要转到原子类型向量,否则可能会出现重复项。我猜发生了一些奇怪的引用或列表循环的事情。