У меня большой список списков.В «выходе» 46 списков.Каждый список представляет собой таблицу с разным количеством строк и столбцов.Моя ближайшая цель - выделить определенный столбец из каждого списка.
Это str (вывод) первых двух списков, чтобы дать вам представление о данных.
> str(output)
List of 46
$ Brain :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 6108 obs. of 8 variables:
..$ p_val : chr [1:6108] "0" "1.60383253411205E-274" "0" "0" ...
..$ avg_diff : num [1:6108] 1.71 1.7 1.68 1.6 1.58 ...
..$ pct.1 : num [1:6108] 0.998 0.808 0.879 0.885 0.923 0.905 0.951 0.957 0.619 0.985 ...
..$ pct.2 : num [1:6108] 0.677 0.227 0.273 0.323 0.36 0.384 0.401 0.444 0.152 0.539 ...
..$ cluster : num [1:6108] 1 1 1 1 1 1 1 1 1 1 ...
..$ gene : chr [1:6108] "Plp1" "Mal" "Ermn" "Stmn4" ...
..$ X__1 : logi [1:6108] NA NA NA NA NA NA ...
..$ Cell Type: chr [1:6108] "Myelinating oligodendrocyte" NA NA NA ...
$ Bladder :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 4656 obs. of 8 variables:
..$ p_val : num [1:4656] 0.00 1.17e-233 2.85e-276 0.00 0.00 ...
..$ avg_diff : num [1:4656] 2.41 2.23 2.04 2.01 1.98 ...
..$ pct.1 : num [1:4656] 0.833 0.612 0.855 0.987 1 0.951 0.711 0.544 0.683 0.516 ...
..$ pct.2 : num [1:4656] 0.074 0.048 0.191 0.373 0.906 0.217 0.105 0.044 0.177 0.106 ...
..$ cluster : num [1:4656] 1 1 1 1 1 1 1 1 1 1 ...
..$ gene : chr [1:4656] "Dpt" "Gas1" "Cxcl12" "Lum" ...
..$ X__1 : logi [1:4656] NA NA NA NA NA NA ...
..$ Cell Type: chr [1:4656] "Stromal cell_Dpt high" NA NA NA ...
Поскольку у меня есть большое количество списков, которые составляют список, япытался создать итерационный код для выполнения задач.Это не было успешным.
Я могу достичь этого вручную или список за списком, но мне не удалось найти итеративный способ сделать это.
x <- data.frame(output$Brain, stringsAsFactors = FALSE)
tmp.list <- x$Cell.Type
tmp.output <- purrr::discard(tmp.list, is.na)
x <- subset(x, Cell.Type %in% tmp.output)
Это дает мне вывод, который я хочу, - это строки в столбце "Cell.Type" со значениями, отличными от NA.
Я получил код ниже, чтобы получить восьмой столбец каждого списка, который является столбцом "Cell.Type".
lapply(output, "[", , 8))
Но здесьЯ обнаружил, что наименование и расположение столбца «Cell.Type» в каждом списке не согласованы.Это означает, что я не могу использовать функцию lapply для подстановки 8-го столбца, так как в некоторых списках это есть, например, в 9-м столбце.
Я попробовал приведенный ниже код, но он не работает и выдает ошибку.
lapply(output, "[", , c('Cell.Type', 'celltyppe'))
#Error: Column `celltyppe` not found
#Call `rlang::last_error()` to see a backtrace
По сути, из моего списка "вывода" я хочу подмножестволибо столбцы «Cell.Type» или «celltyppe» из каждого из 46 списков, чтобы создать новый список с 46 списками только одного столбца значений.Затем я хочу отбросить все строки с помощью NA.
Я хотел бы выполнить это, используя какой-то цикл.
На данный момент я не добился большого успеха.Кажется, что Lapply может извлекать столбцы из списков итеративно, и у меня возникают трудности с попыткой подмножества столбцов имен.
Как только я смогу это сделать, я хочу создать цикл, который может подмножество только строк без NA.
FINAL CODE
Это последний код Iиспользовал, чтобы создать именно то, на что я надеялся.Первая строка кода задает цикл для прохождения каждого списка большого списка.Во второй строке кода выбираются столбцы каждого списка, в имени которого содержится «ell» (тип C ell , тип C ell или тип c ell ),Последний удаляет все строки с "na".
purrr::map(output, ~ .x %>%
dplyr::select(matches("ell")) %>%
na.omit)