首页 > 解决方案 > 试图获得正确的名称(列表)输出

问题描述

我正在尝试使用后缀将 2 级深度字符列表拆分为 1 级列表。更准确地说,我有一个基因列表,每个包含 6 个探针列表,对应于 6 个 bin。架构看起来像:

feat_indexed_probes_bin$HSPB6$bin1

 [1] "cg14513218" "cg22891287" "cg20713852" "cg04719839" "cg27580050" "cg18139462" "cg02956481" "cg26608795" "cg15660498" "cg25654926" "cg04878216"

我正在尝试使用以下架构获取列表“bins_indexed_probes”:

bins_indexed_probes$HSPB6_bin6包含相同的探针,因此我可以将其传递给我的地图减少功能。

我尝试了许多解决方案,例如melt()for 循环等,但我不知道如何执行双嵌套循环(在基因和箱上)并获得只有 1 级深度的列表输出。

目前,我func的做法如下:

create_map <- function(indexes = feat_indexed_probes_bin, binlist = c("bin1", "bin2", "bin3", "bin4", "bin5", "bin6"), genes = features) {
  map <- list()

  ret <- lapply(binlist, function(bin) {
      lapply(rownames(features), function(gene) {
      map[[paste(gene, "_", bin, sep = "")]] <- feat_indexed_probes_bin[[gene]][[bin]]
      tmp_names <<- paste(gene, "_", bin, sep = "")
      return(map)
    })
    names(map) <- tmp_names
    rm(tmp_names)
  })
  return(ret)
}

它返回:

[[6]][[374]]
  GDF10_bin6 
"cg13565300" 

[[6]][[375]]
NULL

[[6]][[376]]
[[6]][[376]]$HNF1B_bin6
[1] "cg03433642" "cg09679923" "cg17652435" "cg03348978" "cg02435495" "cg02701059" "cg05110178" "cg11862993" "cg09463047"


[[6]][[377]]
[[6]][[377]]$GPIHBP1_bin6
[1] "cg01953797" "cg00152340"

相反,我希望像

$GPIHBP1_bin1

"cg...." "cg...."

...

$GPIHBP1_bin6

"someotherprobe"

$someothergene_bin1

"probe" "probe"
...

我希望我很清楚,因为这是我第一次提出问题,如果我没有遵循 stackoverflow 协议,我已经道歉了。

谢谢你已经阅读了我

标签: rlistapply

解决方案


考虑一个嵌套lapply的提取、、[[setNames调用,所有这些都包含在do.callusingc中以将返回元素绑定在一起。

bins_indexed_probes <- do.call(c,
    lapply(1:6, function(i)
           setNames(lapply(feat_indexed_probes_bin, `[[`, i),
                           paste0(names(feat_indexed_probes_bin), "_bin", i))
          )
)

# RE-ORDER ELEMENTS BY NAME                 
bins_indexed_probes <- bins_indexed_probes[sort(names(bins_indexed_probes))]    

Rextester 演示


推荐阅读