Как удалить строки из таблицы, где не пропущенные значения соответствуют подмножеству значений в других строках? - PullRequest
2 голосов
/ 12 марта 2020

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

library(tidyverse)
phony_genes <- tribble(
  ~mouse_entrez, ~mgi_symbol, ~human_entrez, ~hgnc_symbol,
    1,             "a",          2       ,       "A",
    1,             "a",          2       ,        NA,
    1,              NA,          2       ,        "A",
    1,             "a",          3       ,        NA,
    4,             "b",          3       ,        NA,
    5,              NA,          2       ,        "A"
  )

Строка 2 является подмножеством строки 1, поскольку каждое не пропущенное значение в строке 2 такое же, как в строке 1. То же самое относится и к строке 3, но отличается значение отсутствует. Я ищу способ, который использует Tidyverse (или другие пакеты), чтобы отфильтровать строки 2 и 3, но сохранить другие строки. Я не могу отфильтровать значения NA в hgnc_symbol или mgi_symbol, потому что в обоих случаях я потеряю строки, которые хочу сохранить. Я не могу сгруппировать по mouse_entrez и отфильтровать значения NA внутри групп, потому что я хочу сохранить строку 4. Этот простой пример, конечно, может быть расширен до огромного размаха. Я мог бы сделать это, написав что-то сам, но мне интересно, есть ли у кого-нибудь элегантное решение.

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Вот способ сделать это, используя tidyverse:

library(dplyr)
library(purrr)

phony_genes %>%
   mutate(col = pmap(., ~na.omit(c(...)))) %>%
   filter(!map_lgl(seq_along(col), function(x) 
          any(map_lgl(col[-x], function(y) all(col[[x]] %in% y))))) %>%
   select(-col)

#  mouse_entrez mgi_symbol human_entrez hgnc_symbol
#         <dbl> <chr>             <dbl> <chr>      
#1            1 a                     2 A          
#2            1 a                     3 NA         
#3            4 b                     3 NA         
#4            5 NA                    2 A          

Мы получаем все значения в строке как символьный вектор, удаляя значения NA, используя pmap. Для каждой строки проверьте, существует ли полная копия, и удалите эти строки, используя filter.

1 голос
/ 12 марта 2020
library(dplyr)
phony_genes %>%
  group_by(mouse_entrez, mgi_symbol, human_entrez) %>%
  arrange_all(~ is.na(.)) %>%
  slice(1)
# # A tibble: 4 x 4
# # Groups:   mouse_entrez, mgi_symbol, human_entrez [4]
#   mouse_entrez mgi_symbol human_entrez hgnc_symbol
#          <dbl> <chr>             <dbl> <chr>      
# 1            1 a                     2 A          
# 2            1 a                     3 <NA>       
# 3            4 b                     3 <NA>       
# 4            5 c                     2 A          
0 голосов
/ 12 марта 2020

Вы можете группировать по всем столбцам, кроме тех, в которых вы не хотите ничего удалять, а затем удалить пропущенные значения, где общее количество> 1, например:

phony_genes %>%
  group_by(mouse_entrez, human_entrez) %>%
  filter_at(vars(2, 4), all_vars(!(is.na(.) & n() > 1)))

Вывод:

# A tibble: 4 x 4
# Groups:   mouse_entrez, human_entrez [4]
  mouse_entrez mgi_symbol human_entrez hgnc_symbol
         <dbl> <chr>             <dbl> <chr>      
1            1 a                     2 A          
2            1 a                     3 NA         
3            4 b                     3 NA         
4            5 NA                    2 A  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...