Сочетание функции dplyr mutate с поиском по всей таблице - PullRequest
1 голос
/ 11 апреля 2019

Я довольно новичок в R и особенно в аккуратном стихе. Я пытаюсь написать скрипт, с помощью которого мы можем переписать список таксонов. У нас уже есть один, использующий довольно много циклов for и if, и я хочу попытаться упростить его с помощью tidyverse, но я как бы застрял, как это сделать.

у меня есть таблица, которая выглядит примерно так (очень упрощенно)

taxon_file<- tibble(name = c( "cockroach","cockroach2", "grasshopper", "spider",    "lobster",  "insect",   "crustacea",    "arachnid"), 
                Id = c(445,448,446,778,543,200,400,300),
                parent_ID = c(200,200,200,300,400,200,400,300),
                rank = c("genus","genus","genus","genus","genus","order","order","order")
                )    


+-------------+-----+-----------+----------+
|    name     | Id  | parent_ID |   rank   |
+=============+=====+===========+==========+
| cockroach   | 445 | 200       | genus    |
| cockroach2  | 448 | 200       | genus    |
| grasshopper | 446 | 200       | genus    |
| spider      | 778 | 300       | genus    |
| lobster     | 543 | 400       | genus    |
| insect      | 200 | 200       | order    |
| crustacea   | 400 | 400       | order    |
| arachnid    | 300 | 300       | order    |
+-------------+-----+-----+------------+----------+

Теперь я хочу изменить его так, чтобы я получил новый столбец, в который я могу добавить порядок, соответствующий parent_ID (поэтому, когда parent_ID == ID, введите имя в порядке столбцов). Конечный результат должен выглядеть примерно так

+-------------+------------+------+-----------+
|    name     |    order   |  Id  | parent_ID |
+=============+============+======+===========+
| cockroach   |  insect    |  445 |       200 |
| cockroach2  |  insect    |  448 |       200 |
| grasshopper |  insect    |  446 |       200 |
| spider      |  arachnid  |  778 |       300 |
| lobster     |  crustacea |  543 |       400 |
+-------------+------------+------+-----------+

Я пытался объединить mutate с оператором ifelse, но это просто добавляет NA ко всему столбцу заказа.

tibble назван таксон_лист

taxon_list %>%    
   mutate(order = ifelse(parent_ID == Id, Name, NA))

Я знаю, что это не сработает, потому что он не ищет во всем наборе данных правильную строку (это то, что я делал раньше с помощью циклов for). Может быть, кто-то может указать мне правильное направление?

1 Ответ

0 голосов
/ 11 апреля 2019

Одним из способов является filter для каждого типа ранга до 2 отдельных dfs, подмножество с использованием select и merge 2.

  df <- tibble(name = c( "cockroach","cockroach2", "grasshopper", "spider",    "lobster",  "insect",   "crustacea",    "arachnid"), 
                  Id = c(445,448,446,778,543,200,400,300),
                  parent_ID = c(200,200,200,300,400,200,400,300),
                  rank = c("genus","genus","genus","genus","genus","order","order","order"))     

library(tidyverse)

df_order <- df %>%
  filter(rank == "order") %>% 
  select(order = name, parent_ID)

df_genus <- df %>%
  filter(rank == "genus") %>% 
  select(name, Id, parent_ID) %>% 
  merge(df_order, by = "parent_ID")

Результат:

  parent_ID        name  Id     order
1       200   cockroach 445    insect
2       200  cockroach2 448    insect
3       200 grasshopper 446    insect
4       300      spider 778  arachnid
5       400     lobster 543 crustacea
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...