【问题标题】:Combine dplyr mutate function with a search through the whole table将 dplyr mutate 函数与整个表的搜索相结合
【发布时间】:2019-04-11 11:11:25
【问题描述】:

我对 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

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

我知道这行不通,因为它不会在整个数据集中搜索正确的行(这就是我之前对所有 for 循环所做的)。也许有人可以指出我正确的方向?

【问题讨论】:

  • 你好。几件事;确保提供可重现的示例。您可以使用dput(head(your_df)) 做到这一点。另外,parent_ID == Id 是什么意思?在您的示例中 Parent_ID 不等于任何 Id 但您仍然有 order
  • 感谢您的回复。我对原始帖子进行了一些编辑,希望它能以这种方式解释得更多。我现在有一个可行的解决方案。

标签: r tidyverse


【解决方案1】:

一种方法是 filter 将每个等级类型分配到 2 个单独的 dfs,子集使用 selectmerge 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2021-12-09
    相关资源
    最近更新 更多