【问题标题】:Reverse lookup for loop in R在R中反向查找循环
【发布时间】:2019-09-05 17:21:59
【问题描述】:

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

考虑以下数据集

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

如果我输入函数(狗),我想要一个返回鸟然后返回猫的列表。当成分 = N/A 时,该函数知道何时停止(无需查找更多内容)。

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

needed <- list()

for (product in list){

  needed[[product]]<-df
}

df <- dplyr::bind_rows(product)

【问题讨论】:

  • 纠正了我很笨的原因

标签: r for-loop reverse-lookup


【解决方案1】:

您可能会找到一种方法来使用某种类型的树来处理节点。但是,在基础 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"

【讨论】:

    【解决方案2】:

    我附加了您的初始代码以使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 循环,它只检查input 是否存在于product 列中。如果是这样,它会检查product 输入对应的ingredient 是否为非NA 值。如果是这种情况,ingredient 将附加到ans 并成为新的input。我还添加了一个break 语句,以便在您到达NA 时退出while 循环。

    我对您的数据框中没有NA 的情况进行了快速测试,它似乎工作正常。也许这里的其他人可以想出一个更简洁的方法来写这个,但它应该适合你。

    【讨论】:

      猜你喜欢
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多