Я добавил ваш исходный код, чтобы сделать 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
.Если это так, то он проверяет, является ли соответствующий ingredient
для ввода product
значением не-NA.Если это так, ingredient
будет добавлен к ans
и станет новым input
.Я также добавил оператор break
, чтобы выйти из цикла while
, когда вы достигнете NA
.
Я провел быстрый тест на случай, когда в вашем фрейме данных нет NA
, ипохоже, работает нормально.Может быть, кто-то еще здесь может найти более краткий способ написать это, но это должно работать для вас.