Извлечение элементов из фрейма данных 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, чтобы просмотреть список условий тестирования.