#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, взглянув на сообщение. Я думаю, что вам может понадобиться набор данных или список пар ключ/значение, потому что это очень специфично, и нет шаблона, который бы соответствовал этим