如何以递归方式从R中的父子层次结构返回数据?

时间:2015-09-11 16:18:37

标签: r recursion

考虑这个数据集:

myData = data.frame(parent = c(1,3,5,7,8,9)
                    ,child = c(2,4,6,8,9,10))

我想将此数据集过滤到仅属于父#7的记录。在T-SQL中,我将使用递归公用表表达式来完成此操作。有没有办法在R?中优雅地做这样的事情?

1 个答案:

答案 0 :(得分:1)

如果没有一个更复杂的例子,很难确切地看到你需要什么(因为这里没有“递归”。它只有一个层次。但是,要回答你的具体问题,这里有两种方式:

myData = data.frame(parent = c(1,3,5,7,8,9),child = c(2,4,6,8,9,10))

#Using Dplyr
library(dplyr)
myData %>% filter(parent  == "7")

#Using Base R
myData$child[myData$parent == 7]

修改

根据下面的评论,我认为这个简单的脚本会做到这一点。可能有一种更简单的方法,但下面的do while循环是第一个想到的方法:

newParent = 7
answer <- c()
repeat{
  currentResult <- myData$child[myData$parent == newParent]
  if(length(currentResult) != 0){
    newParent <- currentResult
    answer <- c(answer, newParent)
  }else{
    break
  }
}

> answer
[1]  8  9 10

编辑#2

由于OP有兴趣了解它是如何完成的,所以这是递归重写的相同事情:

findChild <- function(myData, parent){
  currentChild <- myData$child[myData$parent == parent]
  if(length(currentChild) != 0){
    return(c(currentChild, findChild(myData, currentChild)))
  }else{
    return()
  }
}

findChild(myData, 7)