1

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

考虑以下数据集

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)
4

2 回答 2

0

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

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。如果是,则检查与输入对应ingredientproduct值是否为非 NA 值。如果是这种情况,ingredient将被附加到ans并成为新的input. 我还添加了一条break语句,while当您到达NA.

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

于 2019-04-15T18:43:57.577 回答
0

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

我还更改了“不适用”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"
于 2019-04-15T20:01:43.147 回答