首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >反向查找R中的循环

反向查找R中的循环
EN

Stack Overflow用户
提问于 2019-04-16 01:00:31
回答 2查看 200关注 0票数 1

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

请考虑以下数据集

代码语言:javascript
复制
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循环是正确的方法。

代码语言:javascript
复制
needed <- list()

for (product in list){

  needed[[product]]<-df
}

df <- dplyr::bind_rows(product)
EN

回答 2

Stack Overflow用户

发布于 2019-04-16 02:43:58

我附加了您的初始代码,使N/A简单地等于NA,这样我就可以在R代码中使用is.na函数。现在示例数据是

代码语言:javascript
复制
ingredients <- c(NA, 'cat', 'bird')
product <- c('cat', 'bird', 'dog')
data <- data.frame(ingredients, product)

代码如下:

代码语言:javascript
复制
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循环,用于检查input是否存在于product列中。如果是,则检查product输入的相应ingredient是否是非NA值。如果是这种情况,ingredient将被附加到ans,并将成为新的input。我还添加了一条break语句,以便在到达NA时跳出while循环。

我在数据帧中没有NA的情况下做了一个快速测试,它似乎工作得很好。也许这里的其他人可以想出一种更简洁的方式来写这篇文章,但它应该适用于你。

票数 0
EN

Stack Overflow用户

发布于 2019-04-16 04:01:43

您可能会找到一种方法来使用某种类型的树来遍历节点。但是,使用基R中的递归函数,我得出了以下结论。

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

代码语言:javascript
复制
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
}

这也会返回输入,您总是可以将其作为向量的第一个元素去掉。

代码语言:javascript
复制
> reverse_lookup(data, "dog")
[1] "dog"  "bird" "cat"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55694061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档