Фильтрация строк с использованием значений столбцов в качестве условия для другого набора данных - PullRequest
0 голосов
/ 14 марта 2019

Это довольно сложно.Допустим, у меня есть, например, первый набор данных df:

sample   id                  name
1        ID200,ID300,ID299   first
2        ID2,ID123           second
3        ID90                third

и второй набор данных df_1:

ids       condition
ID200        y
ID300        n
ID299        n
ID2          y
ID123        y
ID90         n

Мне нужно отфильтровать из первого набора данныхвсе строки, в которых все значения идентификатора удовлетворяют условию во второй таблице, например y.Таким образом, фильтрация в этом примере должна дать:

 sample   id                  name
 2        ID2,ID123           second

Я думал использовать что-то вроде:

new_df = df %>%
  filter(grepl('ID', id), df_1$condition == 'y')

Но, очевидно, мне нужно что-то другое, можете ли вы дать мне несколько подсказок?

Редактировать: Как я уже сказал в комментарии, что произойдет, если у меня есть столбец ID df, заполненный другим текстом, как это?

sample   id                                         name
1              ID = ID200,ID300,ID299,abcd          first
2              ID = ID2,ID123, dfg                  second
3              ID = ID90, text                      third

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Я бы начал с приближения df, так как id содержит по одному наблюдению на строку:

library(tidyr)
library(dplyr)

df %>% 
  separate_rows(id)

  sample    id   name
1      1 ID200  first
2      1 ID300  first
3      1 ID299  first
4      2   ID2 second
5      2 ID123 second
6      3  ID90  third

Та же операция, за которой следует соединение с df_1:

df %>% 
  separate_rows(id) %>% 
  left_join(df_1, by = c("id" = "ids"))

  sample    id   name condition
1      1 ID200  first         y
2      1 ID300  first         n
3      1 ID299  first         n
4      2   ID2 second         y
5      2 ID123 second         y
6      3  ID90  third         n

Теперь вы можете группировать по sample и фильтровать случаи, когда единственным условием является "y":

new_df <- df %>% 
  separate_rows(id) %>% 
  left_join(df_1, by = c("id" = "ids")) %>% 
  group_by(sample) %>% 
  filter(condition == "y", 
         n_distinct(condition) == 1) %>% 
  ungroup()

Результат:

  sample id    name   condition
   <int> <chr> <chr>  <chr>    
1      2 ID2   second y        
2      2 ID123 second y

Если вы действительно хотитепреобразовать обратно в исходный формат с разделенными запятыми идентификаторами в столбце:

library(purrr)
new_df %>% 
  nest(id) %>% 
  mutate(newid = map_chr(data, ~paste(.$id, collapse = ","))) %>% 
  select(sample, id = newid, name)

  sample id        name  
   <int> <chr>     <chr> 
1      2 ID2,ID123 second
1 голос
/ 14 марта 2019

Возможно, немного не элегантно, но это даст вам окончательное состояние состояния каждого образца.

library(tidyverse)

df <- tibble(sample = c(1, 2, 3),
             id = c("ID200,ID300,ID299", "ID2,ID123", "ID90"),
             name = c("first", "second", "third"))

df_1 <- tibble(ids = c("ID200", "ID300", "ID299", "ID2", "ID123", "ID90"),
               condition = c("y", "n", "n", "y", "y", "n"))

df2 <- df %>%
  mutate(ids = str_split(id, ",")) %>%
  unnest() %>%
  inner_join(df_1, by = "ids") %>%
  group_by(sample) %>%
  summarise(condition = min(condition))

Затем вы можете присоединить его к исходному фрейму данных для фильтрации.

filtered <- inner_join(df, df2, by = "sample") %>%
  filter(condition == "y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...