簡體   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