繁体   English   中英

反向查找R中的循环

[英]Reverse lookup for loop in R

我有一组数字/字符串,使其他数字/字符串。 我需要创建一个函数,该函数为我提供创建该数字/字符串所需的所有数字/字符串的列表。

考虑以下数据集

ingredients <- c('N/A', 'cat', 'bird')
product <- c('cat', 'bird', 'dog')
data <- data.frame(ingredients, product)
head(data)

如果我输入function(dog),我想要一个先返回bird然后再返回cat的列表。 该功能知道当配料= N / A时什么时候停止(没有什么可查找的)。

似乎附加某种for循环是正确的方法。

needed <- list()

for (product in list){

  needed[[product]]<-df
}

df <- dplyr::bind_rows(product)

我附加了您的初始代码,以使N/A仅等于NA因此可以在R代码中使用is.na函数。 现在样本数据是

ingredients <- c(NA, 'cat', 'bird')
product <- c('cat', 'bird', 'dog')
data <- data.frame(ingredients, product)

代码如下:

ReverseLookup <- function (input) {
  ans <- list()
  while (input %in% data$product) {
    if (!is.na(as.character(data[which(data$product == input),]$ingredients))) {
      ans <- append(ans, as.character(data[which(data$product == input),]$ingredients))
      input <- as.character(data[which(data$product == input),]$ingredients)
    }
    else {
       break
     }
  }
  print(ans)
}

我创建一个空列表,然后创建一个while循环,该循环仅检查product列中是否存在input 如果是这样,那么它将检查以查看product输入的相应ingredient是否为非NA值。 如果是这种情况,该ingredient将被附加到ans并将成为新的input 我还添加了break语句,以在到达NA时退出while循环。

我对您的数据框中没有NA且看起来工作正常的情况进行了快速测试。 也许这里的其他人可以找到一种更简洁的方式编写此代码,但是它应该对您有用。

您可能会找到一种使用某种类型的树遍历节点的方法。 但是,在基数R中使用递归函数,我想到了这一点。

我也将“ N / A”更改为NA以使生活更轻松。 另外,我在数据帧中添加了stringsAsFactors = F

ingredients <- c(NA, 'cat', 'bird')
product <- c('cat', 'bird', 'dog')
data <- data.frame(ingredients, product, stringsAsFactors = F)

reverse_lookup <- function(data, x, last_result = NULL) {
  if (! is.null(last_result)) {
    x <- data[data$product == last_result[length(last_result)], "ingredients"]
  }

  if (! is.na(x)) {
    last_result <- reverse_lookup(data, x, c(last_result, x))
  }

  last_result
}

这也会返回输入,您可以随时将其作为向量的第一个元素删除。

> reverse_lookup(data, "dog")
[1] "dog"  "bird" "cat"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM