#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))]
Комментарии:
1. спасибо за ответ. Я попробую, как только вернусь домой.