Свернуть дублированные строки одновременно в нескольких столбцах

#r #dplyr

Вопрос:

Начинающий здесь. В настоящее время у меня есть база данных с более чем 33 переменными для более чем 10000 видов животных, и я только что попал в небольшую неприятность.

Подводя итог, мои данные выглядят примерно так:

 species1     species2    info1    info2
Parrot       Parrot      3        NA 
NA           Parrot      NA       7
Osprey       NA          NA       89
Sparrow      Sparrow     NA       19
Sparrow      NA          27       NA
NA           Duck        69       16

 

То, что я пытаюсь здесь сделать, — это свернуть или объединить строки, которые имеют дубликаты в столбцах видов, сохраняя при этом те строки, в которых есть NA. Что-то вроде этого:

 species1     species2    info1    info2
Parrot       Parrot      3        7
Osprey       NA          NA       89
Sparrow      Sparrow     27       19
NA           Duck        69       16

 

Я пробовал group_by , но помимо того, что он группируется только по одной переменной, я не уверен, что это правильный способ. У меня есть 5 других строк видов, которые также могут иметь дубликаты, следует ли мне просто использовать это для каждой из них?

 data %>% 
  group_by(species1) %>% 
  summarise_each(funs(max))
 

Извините, если это слишком очевидно, я всего лишь новичок!
Танк тебе!! 🙂

Ответ №1:

Мы могли coalesce бы объединить столбцы «species1», «species2» в один столбец, сгруппировать столбец coalesce d перед выполнением summarise и удалить его с помощью select

 library(dplyr)
data %>% 
   group_by(species = coalesce(species1, species2)) %>% 
   summarise(across(everything(), ~ .[complete.cases(.)][1]))%>% 
   select(-species)
 

-выход

 # A tibble: 4 x 4
  species1 species2 info1 info2
  <chr>    <chr>    <int> <int>
1 <NA>     Duck        69    16
2 Osprey   <NA>        NA    89
3 Parrot   Parrot       3     7
4 Sparrow  Sparrow     27    19
 

данные

 data <- structure(list(species1 = c("Parrot", NA, "Osprey", "Sparrow", 
"Sparrow", NA), species2 = c("Parrot", "Parrot", NA, "Sparrow", 
NA, "Duck"), info1 = c(3L, NA, NA, NA, 27L, 69L), info2 = c(NA, 
7L, 89L, 19L, NA, 16L)), class = "data.frame", row.names = c(NA, 
-6L))
 

Комментарии:

1. Спасибо вам за вашу помощь! Но у меня все еще есть вопрос: что, если в одном из столбцов вида были значения с другим именем? (допустим, как синоним, например, Duck1) Объединение группировок было бы неэффективным, верно? Что я мог сделать в этом случае?

2. @Prego coalesce работает таким образом, что если соответствующая строка является NA для первого аргумента, она заменяется на не-NA из второго аргумента. Если в конце есть цифры, мы могли бы удалить их с group_by(species = stringr::str_remove(coalesce(species1, species2), "\d $"))

3. Хорошо, а что, если синоним вида был совершенно другим? Как кряква и Утка, и я хотел, чтобы они оба находились в колонке своего вида и в одной строке

4. @Prego это был бы отдельный вопрос, потому что он предполагает использование разных функций. Можете ли вы опубликовать новый вопрос. Спасибо

5. @Prego, взглянув на сообщение. Я думаю, что вам может понадобиться набор данных или список пар ключ/значение, потому что это очень специфично, и нет шаблона, который бы соответствовал этим