[英]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.