Подстановка столбцов в разных позициях и с разными именами в большом списке списков с purrr - PullRequest
0 голосов
/ 02 января 2019

У меня большой список списков.В «выходе» 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 ...

Поскольку у меня есть большое количество списков, которые составляют список, япытался создать итерационный код для выполнения задач.Это не было успешным.

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

    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)

1 Ответ

0 голосов
/ 02 января 2019

Мы можем использовать анонимный вызов функции

lapply(output, function(x) na.omit(x[grep("(?i)Cell\\.?(?i)Typp?e", names(x))]))
#[[1]]
#  Cell.Type
#1         1
#2         2
#3         3
#4         4
#5         5

#[[2]]
#  celltyppe
#1         7
#2         8
#3         9
#4        10
#5        11

Также с purrr

library(tidyverse)
map(output, ~ .x %>%
               select(matches("(?i)Cell\\.?(?i)Typp?e") %>%
               na.omit))

data

output <- list(data.frame(Cell.Type = 1:5, col1 = 6:10, col2 = 11:15), 
          data.frame(coln = 1:5, celltyppe = 7:11))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...