пытаясь получить правильные имена (список) вывод - PullRequest
2 голосов
/ 29 марта 2019

Я пытаюсь разбить 2-х уровневый список персонажей на 1-х уровневый список, используя суффикс. Точнее, у меня есть список генов, каждый из которых содержит 6 списков зондов, соответствующих 6 бинам. Архитектура выглядит так:

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(), для цикла и т. Д., Но я не могу понять, как выполнить двойной вложенный цикл (для генов и для бинов) и получить вывод списка только с глубиной 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.

Спасибо, что уже прочитали меня

1 Ответ

1 голос
/ 29 марта 2019

Рассмотрим вложенные lapply с вызовами extract, [[ и setNames, все они заключены в do.call с использованием c для связывания возвращаемых элементов.

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 Demo

...