Извлечение элементов из фрейма данных R с использованием критериев, заданных в виде списка (column_name = value)

Я хотел бы извлечь элементы из столбца в фрейме данных на основе критериев, относящихся к значениям в других столбцах. Эти критерии приведены в форме списка, связывающего имена столбцов со значениями. Конечная цель - использовать эти элементы для выбора столбцов по имени в другой структуре данных.

Вот пример фрейма данных:

> experimental_plan
  lib genotype treatment replicate
1   A       WT    normal         1
2   B       WT       hot         1
3   C      mut    normal         1
4   D      mut       hot         1
5   E       WT    normal         2
6   F       WT       hot         2
7   G      mut    normal         2
8   H      mut       hot         2

И мои критерии выбора закодированы как следующий список:

> ref_condition = list(genotype="WT", treatment="normal")

Я хочу извлечь элементы в столбце "lib", где строка соответствует ref_condition это "А" и "Е".

1) Я могу получить столбцы для использования с помощью names в моем списке критериев отбора:

> experimental_plan[, names(ref_condition)]
  genotype treatment
1       WT    normal
2       WT       hot
3      mut    normal
4      mut       hot
5       WT    normal
6       WT       hot
7      mut    normal
8      mut       hot

2) Я могу проверить, соответствуют ли полученные строки моим критериям выбора:

> experimental_plan[, names(ref_condition)] == ref_condition
     genotype treatment
[1,]     TRUE      TRUE
[2,]     TRUE     FALSE
[3,]    FALSE      TRUE
[4,]    FALSE     FALSE
[5,]     TRUE      TRUE
[6,]     TRUE     FALSE
[7,]    FALSE      TRUE
[8,]    FALSE     FALSE
> selection_vector <- apply(experimental_plan[, names(ref_condition)] == ref_condition, 1, all)
> selection_vector
[1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

(Я думаю, что этот шаг, с apply не особенно элегантно. Должен быть лучший способ.)

3) Этот логический вектор можно использовать для выбора соответствующих строк:

> selected_lines <- experimental_plan[selection_vector,]
> selected_lines
  lib genotype treatment replicate
1   A       WT    normal         1
5   E       WT    normal         2

4) С этого момента я знаю, как использовать dplyr для выбора интересующих меня товаров:

> lib1 <- filter(selected_lines, replicate=="1") %>% select(lib) %>% unlist()
> lib2 <- filter(selected_lines, replicate=="2") %>% select(lib) %>% unlist()
> lib1
lib 
  A 
Levels: A B C D E F G H
> lib2
lib 
  E 
Levels: A B C D E F G H

Можно dplyr (или другие умные методы) будет использоваться на более ранних этапах?

5) Эти элементы соответствуют именам столбцов в другой структуре данных (названной counts_data Вот). Я использую их, чтобы извлечь соответствующие столбцы и поместить их в список, связанный с повторяющимися числами в виде имен:

> counts_1 <- counts_data[, lib1]
> counts_2 <- counts_data[, lib2]
> list_of_counts <- list("1" <- counts_1, "2" <- counts_2)

(В идеале я хотел бы обобщить код так, чтобы мне не нужно было знать (я имею в виду, "жестко их кодировать"), какие различные значения существуют в столбце "копия": для данного заданного числа может быть любое количество повторов сочетание характеристик "генотип" и "лечение", и я хочу, чтобы мой окончательный список содержал данные из counts_data относящиеся к соответствующим пунктам "lib".)

Есть ли способ сделать весь процесс более элегантно / эффективно?

1 ответ

Я думаю, что вы можете использовать data.table для этого с ключом

library(data.table)
test <- data.table(lib = LETTERS[1:8],
           genotype = rep(c("WT","WT","mut","mut"),2),
           treatment = rep(c("normal","hot"),4),
           replicate = c(rep(1,4),rep(2,4)))
setkeyv(test,c("genotype","treatment"))
ref_condition = list(genotype="WT", treatment="normal")
test[ref_condition,lib]

Это дает

[1] "A" "E"

Конечно, вы можете использовать lapply, чтобы просмотреть список условий тестирования.

Другие вопросы по тегам