пытаюсь получить на выходе правильные имена (список)

#r #list #apply

#r #Список #применить

Вопрос:

Я пытаюсь разделить двухуровневый список символов на список 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() , цикл 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.

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

Комментарии:

1. Здравствуйте, добро пожаловать в Stackoverflow. Пожалуйста, предоставьте (небольшой) образец вашего набора данных с dput() , чтобы ваш код и проблема были воспроизводимы.

Ответ №1:

Рассмотрим вложенный файл lapply с вызовами extract, [[ и setNames , все они заключены в do.call using 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))]    
  

Демо-версия Rext Tester

Комментарии:

1. спасибо за ответ. Я попробую, как только вернусь домой.