我有一个包含数千行和以下列的数据集:ID、ParentID、RANK和Science Name.

我希望创建一个新的专栏,它将通知给定物种所属的family(rank中的一个级别).如果有人能帮上忙,我将不胜感激.

示例数据:

ID = c('f1','f2','g1','g2','g3','g4','s1','s2','s3','s4','s5','s6') # all unique
parentID = c(NA,NA,'f1','f1','f2','f2','g1','g1','g2','g3','g3','g4')
rank = c('family','family','genus','genus','genus','genus','species','species','species','species','species','species')
scientificName = c('FamA','FamB','GenA','GenB','GenC','GenD','SpA','SpB','SpC','SpD','SpE','SpF')
dat = data.frame( ID, parentID, rank, scientificName)

我想要的输出(在本例中)是一个额外的列,告知这些族为: Family=c(‘FAMA’,‘FAMB’,‘FAMA’,‘FAMA’,‘FAMB’,‘FAMA’,‘FAMA’,‘FAMB’,‘FAMB’)

我曾想过创建家族及其ID的矢量,然后在ParentID栏中用姓氏更改代码,然后try 类似的方法,让该属最终将家族信息与每个物种联系起来,但最终变得有点混乱(也就是说,它不起作用).我想我需要的东西可以通过‘dplyr’套餐来完成,但我被卡住了…再说一次,如果能帮上忙我会很感激.

推荐答案

这是一个很好的递归问题.这是一个矢量化的基本R解.

find_family <- function(ID, parentID, scientificName) {
  find_family_id <- function(ID, parentID) {
    ID_new <- ifelse(!is.na(parentID), parentID, ID)
    parentID_new <- parentID[match(ID_new, ID)]
    if (all(is.na(parentID_new))) return(ID_new)
    find_family_id(ID_new, parentID_new)
  }
  family_ids <- find_family_id(ID, parentID)
  scientificName[match(family_ids, ID)]
}

dat$family <- with(dat, find_family(ID, parentID, scientificName))

dat
#    ID parentID    rank scientificName family
# 1  f1     <NA>  family           FamA   FamA
# 2  f2     <NA>  family           FamB   FamB
# 3  g1       f1   genus           GenA   FamA
# 4  g2       f1   genus           GenB   FamA
# 5  g3       f2   genus           GenC   FamB
# 6  g4       f2   genus           GenD   FamB
# 7  s1       g1 species            SpA   FamA
# 8  s2       g1 species            SpB   FamA
# 9  s3       g2 species            SpC   FamA
# 10 s4       g3 species            SpD   FamB
# 11 s5       g3 species            SpE   FamB
# 12 s6       g4 species            SpF   FamB

R相关问答推荐

如何修复R码的置换部分?

为什么在ggplot2中添加geom_text这么慢?

将向量组合到一个数据集中,并相应地命名行

删除列表中存储的数据帧内和数据帧之间的重复行

计算具有奇数日期的运行金额

如何在R中合并两个基准点?

在ggplot2的框图中绘制所有级别的系数

以相同的方式对每个表进行排序

比较理论阿尔法和经验阿尔法

仅在Facet_WRAP()中的相应方面包含geom_abline()

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

当我们有多个反斜杠和/特殊字符时使用Gsubing

从圆到R中的多边形的标绘雷达图

在R函数中使用加号

从多层嵌套列表构建Tibble?

如何计算每12行的平均数?

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

计算来自单独分组的分幅的值的百分位数

R:改进实现简单模型

从data.table列表中提取特定组值,并在R中作为向量返回