Фильтрация с помощью dplyr с использованием двух отдельных критериев выбора, включающих два столбца - PullRequest
0 голосов
/ 30 июня 2018

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

В моем представлении ниже имитируется data.frame, который включает 4 выборки: Control, Drug_1, Drug_2 и Drug_3 и парные сравнения между ними (разница показана как p_value). Я хотел бы использовать этот фрагмент кода в функции, чтобы потенциально сравнить более 4 групп. Я попытался объединить критерии фильтрации с OR операторами, но закончил довольно уродливым кодом.

Моя конечная цель - получить filtered_df, который показывает все строки, в которых переменные group1 и group2 содержат пары данных, которые есть в моем списке comparisons. Любая помощь приветствуется!

Лучший, Atakan

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

# Make a mock data frame
gene <- "ABCD1"
group1 <- c("Control", "Control", "Control", "Drug_1", "Drug_1", "Drug_2")
group2 <- c("Drug_1", "Drug_2", "Drug_3", "Drug_2", "Drug_3", "Drug_3")
p_value <- c(0.4, 0.001, 0.003, 0.01, 0.3, 0.9)

df <- data.frame(gene, group1, group2, p_value)
df
#>    gene  group1 group2 p_value
#> 1 ABCD1 Control Drug_1   0.400
#> 2 ABCD1 Control Drug_2   0.001
#> 3 ABCD1 Control Drug_3   0.003
#> 4 ABCD1  Drug_1 Drug_2   0.010
#> 5 ABCD1  Drug_1 Drug_3   0.300
#> 6 ABCD1  Drug_2 Drug_3   0.900

# I'd like to filter rows when group1 and group2 matches the following pairs
comparisons <- list(c("Control", "Drug_1"), c("Control", "Drug_2"), c("Drug_2", "Drug_3"))


# I can filter by using one pair as follows:
filtered_df <- df %>%
  filter(group1 == comparisons[[1]][1] & group2 == comparisons[[1]][2])

filtered_df
#>    gene  group1 group2 p_value
#> 1 ABCD1 Control Drug_1     0.4

Создано в 2018-06-29 пакетом Представить (v0.2.0).

1 Ответ

0 голосов
/ 30 июня 2018

Мы можем сделать это несколькими способами.

1) Одним из способов является циклический просмотр list («сравнения»), а затем выполнение filter для отдельного набора данных и связывание выходных данных (map_df)

library(tidyverse)
map_df(comparisons, ~ df %>%
                         filter(group1 == .x[1] & group2 == .x[2]))

2) Другой вариант - преобразовать list в data.frame и выполнить inner_join с первым набором данных

do.call(rbind, comparisons) %>% # rbind to a matrix
         as.data.frame %>% # convert to a data.frame
         set_names(c("group1", "group2")) %>% # change the column names
         inner_join(df) # and inner join

3) или с использованием merge из base R (аналогично 2)

merge(df, as.data.frame(do.call(rbind, comparisons)),
            by.x = c("group1", "group2"), by.y = c("V1", "V2"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...