【发布时间】: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列 -
感谢您的回复。我对原始帖子进行了一些编辑,希望它能以这种方式解释得更多。我现在有一个可行的解决方案。